1.Hive解析json的函数:
1)get_json_object(string json_string, string path)
返回值:String
说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NUll,这个函数每次只能返回一个数据项。
注意:path表达式为 "$.key" 的形式,可以拿子key
例如:
select get_json_object('{"movie":"594","rate":"4","timeStamp":"978302268","uid":"1"}','$.movie');
2)json_tuple(jsonStr, k1, k2, ...)
参数:json字符串和一组键k1,k2,...,
返回值:返回值的元组。
说明:解析json的字符串jsonStr,返回key指定的内容。如果输入的json字符串无效,那么返回NUll,这个函数每次能返多个数据项。该方法比get_json_object高效,可以在一次调用中输入多个键。
注意:多个key以 , 分隔,直接以 "key" 的形式传入
例如:
select b.b_movie,b.b_rate,b.b_timeStamp,b.b_uid from json a lateral view
json_tuple(a.data,'movie','rate','timeStamp','uid') b as b_movie,b_rate,b_timeStamp,b_uid;
json_tuple相当于get_json_object的优势就是一次可以解析多个Json字段。但是如果我们有个Json数组,这两个函数都无法处理
2.解析json数组
原理:结合explode函数,先把数组炸开,再单独解析。
工作中遇到的json示例:
需要拿id,phone,org_number,trans_date,写法如下:
select *,json_tuple(json,'id','phone','org_number','trans_date') from(
select *,
explode(split(
regexp_replace(
SUBSTR(trans_form,2,length(trans_form)-2) --将开头结尾的[]去掉
,'\\,\\{\\"id','\\#\\#\\{\\"id') --将 Json 数组元素之间的逗号换成分号
,'\\#\\#') --以双#号作为分隔符
) as json
FROM (SELECT id,record_id,cid,org_number,trans_form,create_time FROM ods_xxx_truck_driver_record104093_new WHERE dt='${dbst}' AND create_time > '2021-02-03')
) test
这里是测试可行性的sql,不是用到生产环境的sql。
具体怎么切割,还要看具体的json格式,思路就是这样。