如何在Hive中使用Map類型?
溫馨提示:如果使用電腦查看圖片不清晰,可以使用手機打開文章單擊文中的圖片放大查看高清原圖。
Fayson的github: https://github.com/fayson/cdhproject
提示:代碼塊部分可以左右滑動查看噢
1.文檔編寫目的
在前面的文章Fayson介紹了《Hive創建外部表CSV數據中列含有逗號問題處理》。本篇文章Fayson主要介紹在Hive中使用Map類型存儲數據。
內容概述
1.環境準備
2.創建Hive表及測試
3.總結
- 測試環境
1.CM和CDH版本為5.15
2.環境準備
準備測試數據,文本數據內容如下:
0098.HK,104,2018-10-21T22:20:00.105Z,name:fayson|sex:男|age:180098.HK,104,2018-10-21T22:20:00.105Z,name:fayson1|sex:男|age:190098.HK,104,2018-10-21T22:20:00.105Z,name:fayson2|sex:男|age:200098.HK,104,2018-10-21T22:20:00.105Z,name:fayson3|sex:男|age:210098.HK,104,2018-10-21T22:20:00.105Z,name:fayson4|sex:男|age:22
將準備好的測試數據保存到test.csv文件中,並上傳至HDFS的/mdtick/hk/csv目錄下。
[root@cdh03 ~]# cat test.csv[root@cdh03 ~]# hadoop fs -put test.csv /mdtick/hk/csv/[root@cdh03 ~]# hadoop fs -ls /mdtick/hk/csv/[root@cdh03 ~]# hadoop fs -cat /mdtick/hk/csv/test.csv
(可左右滑動)
3.創建Hive表
1.使用如下SQL語句創建一個包含Map類型的表
CREATE EXTERNAL TABLE csvtable2( symbol string, tickSequence string, timeStamp string, tickdata MAP<String, string>)ROW FORMAT DELIMITED FIELDS TERMINATED BY ","COLLECTION ITEMS TERMINATED BY "|"MAP KEYS TERMINATED BY ":"STORED AS TEXTFILE LOCATION "/mdtick/hk/csv";
(可左右滑動)
如上SQL建表語句中需要注意的是,Map類型裡面定義了Key和Value的數據類型。Map類型中定義的欄位與示例數據中的「name:fayson|sex:男|age:18」,該數據以k-v方式存儲。Collection items terminated by 「|」,表示Map中每個kv直接以」|」分割,MAP KEYS TERMINATED BY ":",表示kv之間數據以「:」分割。
2.使用Hue在Hive中創建測試表
3.使用SQL命令查看csvtable2表數據
4.使用SQL語句查看Map中數據
select symbol,ticksequence,tickdata["name"], tickdata["sex"], tickdata["age"] from csvtable2;
(可左右滑動)
4.總結
1.在Hive表中定義Map類型數據,Map只能以K-V的方式定義一批數據的數據類型,與Struct相比對每個欄位的類型定義沒有那麼靈活。
2.使用SQL語句查詢Map中數據時需要指定查詢欄位的key。
3.同樣Map也是支持嵌套數據格式Map<String,<Struct>>等。
推薦閱讀: