hive 存儲,解析,處理json數據


 hive 處理json數據總體來說有兩個方向的路走

1、將json以字符串的方式整個入Hive表,然后通過使用UDF函數解析已經導入到hive中的數據,比如使用LATERAL VIEW json_tuple的方法,獲取所需要的列名。

2、在導入之前將json拆成各個字段,導入Hive表的數據是已經解析過得。這將需要使用第三方的SerDe。

 

測試數據為新浪微博測試公開數據

該數據采用json格式存儲,
id代表當前用戶微博的id,
ids代表當前微博用戶關注其他微博用戶的id列表,
total_number是關注微博用戶的總量。

{"id": 1701439105,"ids": [2154137571,3889177061,1496915057,……,1663973284],"total_number": 493}

 

第一種:

導入數據

CREATE TABLE IF NOT EXISTS tmp_json_test (
           json string
) 
STORED AS textfile ;

load data local inpath '/opt/datas/weibotest.json' overwrite into table tmp_json_test;

解析數據:

select get_json_object(t.json,'$.id'), get_json_object(t.json,'$.total_number') from tmp_json_test t ; 
 
select t2.* from tmp_json_test t1 lateral view json_tuple(t1.json, 'id', 'total_number') t2 as c1, c2;
 
 方法一使用函數get_json_object  , 方法二使用函數 json_tuple

 

第二種:

第二種方式相比第一種更靈活,更通用。重要的是每行必須是一個完整的JSON,一個JSON不能跨越多行。

1. 下載Jar
使用之前先下載jar:

http://www.congiu.net/hive-json-serde/
如果要想在Hive中使用JsonSerde,需要把jar添加到hive類路徑中:

add jar json-serde-1.3.7-jar-with-dependencies.jar;

 

導入數據

CREATE TABLE tmp_json_array (
id string,
ids array<string>,
`total_number` int)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;

LOAD DATA LOCAL INPATH '/opt/datas/weibotest.json' OVERWRITE INTO TABLE  tmp_json_array;

 

倒入之后就可以隨便使用了

select * from tmp_json_array where array_contains(ids,'2813165271') or array_contains(ids,'1419789200');

 

需要注意的是當你的數據中包含有不符合json規范的行時,運行查詢會報異常

 

測試可以增加配置用以跳過錯誤數據

ALTER TABLE weibo_json SET SERDEPROPERTIES ( "ignore.malformed.json" = "true");

在運行查詢不會報錯,但是壞數據記錄將變為NULL。

 

最后需要提醒的是當你的json數據中包含hive關鍵字時,導入的數據會有問題,此時 SerDe可以使用SerDe屬性將hive列映射到名稱不同的屬性

如果ids是hive關鍵字的話,更改建表語句如下:

CREATE TABLE tmp_json_array (
id string,
ids_alias array<string>,
`total_number` int)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ("mapping.ids_alias"="ids")
STORED AS TEXTFILE;

 


免責聲明!

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



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