问题描述
在hive中json_tuple用于一次性从json字符串中提取多个字段,比get_json_object效率高,但如果遇到2条json中提取的字段名称不一致,就会遇到提取失败的情况,如下:
id,json_col
123|{"name":"张三","query_time":"09点59分"}
456|{"name":"李斯特","create_date":"2019-04-18"}
解决方式
对于公用的多字段用json_tuple来提取,对于不同的字段,用case when+get_json_object来提取,即可解决。
第一次提取
直接用json_tuple中使用if或case when进行判断来进行解析:
select id,name,create_date from test_json
lateral view json_tuple(json_col,'name',if(id='123','query_time','create_date'))jt as name,create_date;
提取结果
123 张三 NULL
456 李斯特 2019-04-18
第二次提取
这次使用json_tuple+get_json_object来提取
select id,name,
case when id='123' then get_json_object(json_col,'$.query_time')
else get_json_object(json_col,'$.create_date') end as create_date
from test_json
lateral view json_tuple(json_col,'name')j as name;
提取结果
123 张三 09点59分
456 李斯特 2019-04-18
提取成功。