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 對應上面的數據
|
建表
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。