hive json字段解析

        在写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! 否则性能并不乐观。 

你可能感兴趣的:(hive,json)