Hive json数组解析 - 实现json数据的列转行
hive中解析json字符串常用的函数是get_json_object, 但对于数组形式存储的, 如下名字marked_json的字段:[{"id":559,"labelType":3,"labelCode":"BUMANYI","labelName":"不满意","isGrouped":1},{"id":560,"labelType":3,"labelCode":"YTSBCW","labelName":"意图识别错误","isGrouped":1}]
这种格式的就无法直接解析.
平时在需求中, 常会有要提取其中多个id的需求, 碰到这种情形, 当然要感慨, 如果系每个json串是array的一个子元素多好啊.
这种感慨, 也就是处理的思路, 既然还不是array, 能不能分离成array?
于是乎, 掐头去尾后以'},{'分隔, split处理形成数组.split(substring(marked_json,3,length(marked_json)-4),'\\},\\{')
在此基础上, 再利用hive的lateral view explode语法。lateral view explode(split(substring(marked_json,3,length(marked_json)-4),'\\},\\{')) view_table_name as mj
现在, 我们的mj变成了 "id":559,"labelType":3,"labelCode":"BUMANYI","labelName":"不满意","isGrouped":1 这种光光秃秃的字符串, 要想提取其中的信息, 还要再转回json格式 concat('{', mj, '}') 下面, 可以提取我们感兴的内容了, 比如id:select get_json_object(concat('{', mj, '}'), '$.id') as id from hive_table lateral view explode(split(substring(marked_json,3,length(marked_json)-4),'\\},\\{')) vv as mj
当然, 如果我们的Array的元素是固定的, 比如上面的例子中, 元素不会超过两个, 那就可以这样简单处理select get_json_object(concat('{"jl":',marked_json,'}'),'$.jl[0].id'),get_json_object(concat('{"jl":',marked_json,'}'),'$.jl[1].id') from hive_table
发表于:2019-08-27 15:09:48浏览(1464)
评论(0)
数据分析