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示例:
微信图片_20210223100932.png

需要拿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格式,思路就是这样。