在写Hive SQL时,需要从一个json列中解析出多个key的信息,可以使用get_json_object或json_tuple。
1. get_json_object()
是个UDF,在Mapper阶段的列投影时完成获取解析json的操作,如果要获取多个key,那么json字段就要解析多次!但比较常用。
select get_json_object(msg, '$.A') as A
,get_json_object(msg, '$.B') as B
,get_json_object(msg, '$.C') as C
,dt
from test.table_name
where dt='2023-03-01'
and tag='msg_info'
;
2. json_tuple()
在Hive里面是使用UDTF来实现的,即普通的一行转多行。它会生成两个Select Operator 操作,一个扫描不用解析的数据,生成一行,另外一个扫描需要解析的数据进行解析,然后再使用Lateral View Join Operator 操作将这两部分数据join关联起来。但这里的Join并不会真正触发Shuffle的join,只是将非UDTF和UDTF字段通过ArrayList的addAll()连接在一起而已。
select A,B,C,dt
from (
select *
from test.table_name t1
lateral view json_tuple(message, 'A','B','C') t2 as A,B,C
where dt='2023-03-01'
and tag='msg_info'
) t
;
个人测试结论:
json_tuple 对于从json字段中解析的key特别多时(50个以上的key),性能要高于get_json_object! 否则性能并不乐观。