hive 处理json数据整体来讲有两个方向的路走json
一、将json以字符串的方式整个入Hive表,而后经过使用UDF函数解析已经导入到hive中的数据,好比使用LATERAL VIEW json_tuple的方法,获取所须要的列名。app
二、在导入以前将json拆成各个字段,导入Hive表的数据是已经解析过得。这将须要使用第三方的SerDe。函数
测试数据为新浪微博测试公开数据测试
该数据采用json格式存储,
id表明当前用户微博的id,
ids表明当前微博用户关注其余微博用户的id列表,
total_number是关注微博用户的总量。spa
{"id": 1701439105,"ids": [2154137571,3889177061,1496915057,……,1663973284],"total_number": 493}.net
第一种:code
导入数据orm
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;
解析数据:blog
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
第二种:ci
第二种方式相比第一种更灵活,更通用。重要的是每行必须是一个完整的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;