hive詳細筆記(五)-Hive之集合數據類型(附帶講解視頻 )

hive支持集合數據類型

數據類型

描述

語法示例

STRUCT(結構體)對象

和c語言中的struct類似,都可以通過“點”符號訪問元素內容。例如,如果某個列的數據類型是STRUCT{first STRING, last STRING},那麼第1個元素可以通過字段.first來引用。

struct()

MAP 映射

MAP是一組鍵-值對元組集合,使用數組表示法可以訪問數據。例如,如果某個列的數據類型是MAP,其中鍵->值對是’first’->’John’和’last’->’Doe’,那麼可以通過字段名[‘last’]獲取最後一個元素

map()

ARRAY 數組

數組是一組具有相同類型和名稱的變量的集合。這些變量稱爲數組的元素,每個數組元素都有一個編號,編號從零開始。例如,數組值爲[‘John’, ‘Doe’],那麼第2個元素可以通過數組名[1]進行引用。

Array()

數據如下

{

    "name": "songsong",

    "friends": ["bingbing" , "lili"] ,       //列表Array,

    "children": {                      //鍵值Map,

        "xiao song": 18 ,

        "xiaoxiao song": 14

    }

    "address": {                      //結構Struct,

        "street": "hui long guan" ,

        "city": "beijing"

    }

}

 

創建本地測試文件test.txt  對應上面的數據

songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing

yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing

建表

drop table  tb_teacher ;
create table tb_teacher(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
load data local inpath "/hive/data/teacher.txt" into table tb_teacher ;

select * from tb_teacher ;
+------------------+----------------------+--------------------------------------+----------------------------------------------+
| tb_teacher.name  |  tb_teacher.friends  |         tb_teacher.children          |              tb_teacher.address              |
+------------------+----------------------+--------------------------------------+----------------------------------------------+
| songsong         | ["bingbing","lili"]  | {"xiao song":18,"xiaoxiao song":19}  | {"street":"hui long guan","city":"beijing"}  |
| yangyang         | ["caicai","susu"]    | {"xiao yang":18,"xiaoxiao yang":19}  | {"street":"chao yang","city":"beijing"}      |
+------------------+----------------------+--------------------------------------+----------------------------------------------+

 1 處理結構體數據類型

類似於對象.屬性的形式處理數據  address.city address.street

select
name ,
address.city ,
address.street
from
tb_teacher ;
+-----------+----------+----------------+
|   name    |   city   |     street     |
+-----------+----------+----------------+
| songsong  | beijing  | hui long guan  |
| yangyang  | beijing  | chao yang      |
+-----------+----------+----------------+

2 處理數組數據類型

select
name ,
friends[0] as arr_0 ,
friends[1] as arr_1 ,
address.city ,
address.street
from
tb_teacher ;
+-----------+-----------+--------+----------+----------------+
|   name    |   arr_0   | arr_1  |   city   |     street     |
+-----------+-----------+--------+----------+----------------+
| songsong  | bingbing  | lili   | beijing  | hui long guan  |
| yangyang  | caicai    | susu   | beijing  | chao yang      |
+-----------+-----------+--------+----------+----------------+

select
name ,
friends[0] as arr_0 ,
friends[if( 3>=size(friends) , size(friends)-1 , 3)],
size(friends)  arr_size ,
address.city ,
address.street
from
tb_teacher ;

3 處理map數據類型

map_keys() --->返回所有key的數組  

map_values() --->返回所有value的數組

map[key] --->根據key獲取value值

select
name ,
map_keys(children) ,
map_keys(children)[0]
from
tb_teacher ;

+-----------+--------------------------------+------------+
|   name    |              _c1               |    _c2     |
+-----------+--------------------------------+------------+
| songsong  | ["xiao song","xiaoxiao song"]  | xiao song  |
| yangyang  | ["xiao yang","xiaoxiao yang"]  | xiao yang  |
------------------------------------------------------------
select
name ,
map_keys(children) ,
map_keys(children)[0] ,
map_values(children)
from
tb_teacher ;
+-----------+--------------------------------+------------+----------+
|   name    |              _c1               |    _c2     |   _c3    |
+-----------+--------------------------------+------------+----------+
| songsong  | ["xiao song","xiaoxiao song"]  | xiao song  | [18,19]  |
| yangyang  | ["xiao yang","xiaoxiao yang"]  | xiao yang  | [18,19]  |
+-----------+--------------------------------+------------+----------+
select
name ,
size(children) map_size,
map_keys(children)[0] as name_1 ,
map_values(children)[0] as age_1
from
tb_teacher ;
+-----------+-----------+------------+--------+
|   name    | map_size  |   name_1   | age_1  |
+-----------+-----------+------------+--------+
| songsong  | 2         | xiao song  | 18     |
| yangyang  | 2         | xiao yang  | 18     |
+-----------+-----------+------------+--------+


select
name ,
children['xiao song'] as c_name  --  根據key取value
from
tb_teacher ;

 數據類型轉換 

Hive的原子數據類型是可以進行隱式轉換的,類似於Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換爲INT類型,但是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換爲TINYINT類型,它會返回錯誤,除非使用CAST操作。

1.隱式類型轉換規則如下

(1)任何整數類型都可以隱式地轉換爲一個範圍更廣的類型,如TINYINT可以轉換成INT,INT可以轉換成BIGINT。

(2)所有整數類型、FLOAT和STRING類型都可以隱式地轉換成DOUBLE。

(3)TINYINT、SMALLINT、INT都可以轉換爲FLOAT。

(4)BOOLEAN類型不可以轉換爲任何其它的類型。

2.可以使用CAST操作顯示進行數據類型轉換

例如CAST('1' AS INT)將把字符串'1' 轉換成整數1;如果強制類型轉換失敗,如執行CAST('X' AS INT),表達式返回空值 NULL。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章