Hive的列除了支持基本的數據類型外,還支持使用Struct、Map和Array三種集合數據類型。 假設某表有如下一行,我們用JSON格式來表示其數據結構。在Hive下訪問的格式為 { "name": "John Doe", "salary": 100000.0 , "subordinates": ... ...
Hive的列除了支持基本的數據類型外,還支持使用Struct、Map和Array三種集合數據類型。
假設某表有如下一行,我們用JSON格式來表示其數據結構。在Hive下訪問的格式為
{ "name": "John Doe", "salary": 100000.0 , "subordinates": ["Mary Smith" , "Todd Jones"] , //列表Array, subordinates[1]=”Tood Jones” "deductions": { //鍵值Map, deductions[’Federal Taxes’]=0.2 "Federal Taxes": 0.2 , "State Taxes": 0.05, "Insurance": 0.1 } "address": { //結構Struct, address.city=”Chicago” "street": "1 Michigan Ave." , "city": "Chicago" , "state": "IL" , "zip": 60600 } }
基於上述數據結構,我們在Hive里創建對應的表,並導入數據。
創建本地測試文件6_1.txt
John Doe,100000.0,Mary Smith_Todd Jones,Federal Taxes:0.2_State Taxes:0.05_Insurance:0.1,1 Michigan Ave._Chicago_1L_60600
Tom Smith,90000.0,Jan_Hello Ketty,Federal Taxes:0.2_State Taxes:0.05_Insurance:0.1,Guang dong._China_0.5L_60661
註意,STRUCT和ARRAY里的元素間關係都可以用同一個字元表示,這裡用“_”。
Hive上創建測試表employees
CREATE TABLE learn.employees( name STRING, sa1ary FLOAT, subordinates ARRAY<STRING>, deductions MAP<STRING, FLOAT>, address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' -- 列分隔符 COLLECTION ITEMS TERMINATED BY '_' -- STRUCT 和 ARRAY 的分隔符 MAP KEYS TERMINATED BY ':' -- MAP中的key與value的分隔符 LINES TERMINATED BY '\n'; -- 行分隔符
導入文本數據到測試表
load data local inpath "/home/hadoop/files/input/6_1.txt" overwrite into table learn.employees ;
訪問三種集合列里的數據,以下分別是ARRAY,MAP,STRUCT的訪問方式
hive> select subordinates[1], deductions['Federal Taxes'],address.city from learn.employees; OK Todd Jones 0.2 Chicago Hello Ketty 0.2 China Time taken: 0.123 seconds, Fetched: 2 row(s)
通過集合類型來定義列的好處是什麼?
在大數據系統中,不遵循標準格式的一個好處就是可以提供更高吞吐量的數據。
當處理的數據的數量級是T 或者P 時,以最少的"頭部定址"來從磁碟上掃描數據是非常必要的。按數據集進行封裝的話可以通過減少定址次數來提供查詢的速度。而如果根據外鍵關係關聯的話則需要進行磁碟間的定址操作,這樣會有非常高的性能消耗。