Hive集合數據類型


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 時,以最少的"頭部尋址"來從磁盤上掃描數據是非常必要的。按數據集進行封裝的話可以通過減少尋址次數來提供查詢的速度。而如果根據外鍵關系關聯的話則需要進行磁盤間的尋址操作,這樣會有非常高的性能消耗。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM