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 |



