hive函数get_json_object不支持含特殊字符的key。

例如,解析的json的key中包含’.‘,'@','#','$'等特殊字符。直接解析的话,结果为null。

select

 get_json_object(a.json,'$.ro\.boot\.serialn') as rbs  --null  不支持转义

,get_json_object(a.json,'$.\@serialNo') as sn  --null  不支持转义

,get_json_object(a.json,'$.@serialNo') as sn1   --null 不支持特殊字符@

,get_json_object(a.json,'$.seri#alNo') as sn2   --null 不支持特殊字符#

from (

  select

   '{"ro.boot.serialn":"adc","@serialNo":"123","seri#alNo":"456"}' as json

) as a

;

可以有如下解决方案。

  • 方案1(不推荐,性能不是很好):使用正则提取函数regexp_extract提取含特殊字符的key的值。

select regexp_extract('{"ro.boot.serialn":"adc","@serialNo":"123","seri$alNo":"456"}','seri\\$alNo":"([^"]+)',1)

  • 方案2(不太可取,可能影响实际数据):使用正则替换函数regexp_replace替换特殊字符为空字符串再使用get_json_object解析。

select get_json_object(regexp_replace ('{"ro.boot.serialn":"adc","@serialNo":"123","seri#alNo":"456"}', '@', '' ), "$.serialNo" )

  • 方案3(推荐):使用json_tuple函数配合lateral view进行解析。

select

 json.serialNo  --123

,json.ro  --abc

,json.sn  --456

from (

  select

   '{"ro.boot.serialn":"adc","@serialNo":"123","seri#alNo":"456"}' as json

) as a

lateral view json_tuple(a.json,'ro.boot.serialn','@serialNo','seri#alNo') json as ro,serialNo,sn3

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐