博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(Hive)史上最难解析的json字符串解析出来了!!
阅读量:4679 次
发布时间:2019-06-09

本文共 1360 字,大约阅读时间需要 4 分钟。

首先说下解析的数据如下:

{"username":"king","actionInfo":{"id":1,"age":"22","partList":[{"code":"123","uname":"king"},{"code":"0012","uname":"king"}]}}

刚开始看,这个就是一个Map结构嵌套了Map,再嵌套了一个数组结构。通常情况下的表结构定义如下:

create table dw_stg.test(username string,actionInfo_id string,actionInfo_age string,actionInfo_partlist array
>)ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'STORED AS TEXTFILE;

这样当数据来直接插入到hdfs中,然后利用explode就可以一行转多行扩展开了。

但是我的需求是这个actionInfo中的字段不固定的,可能是任意的结构,所以我定义的表结构中以string类型存放。如下:

create table dw_stg.test(username string,actionInfo string)ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'STORED AS TEXTFILE;

这时候在做数据清洗时,需要通过json_tuple, get_json_object,explode等函数将string类型解析出来。

[{"code":"123","uname":"king"},{"code":"0012","uname":"king"}]

在字符串时针对上面中括号中等值解析时一直报错。

最后使用正则的方式,将中括号替换掉,然后在转化为数组,从而解析成功。参考以下代码:

select username,ai.id,ai.age,p.uname,p.code from test1 lateral view json_tuple(actioninfo,'id','age','partlist') ai as id,age,partlistlateral view explode(split(regexp_replace(regexp_extract(partlist,'^\\[(.+)\\]$',1),'\\}\\,\\{
', '\\}\\|\\|\\{
'),'\\|\\|')) partlist as plateral view json_tuple(p,'code','uname') p as code,uname

这里比较重要的一段是:

explode(split(regexp_replace(regexp_extract('包含中括号的字符串','^\\[(.+)\\]$',1),'\\}\\,\\{
', '\\}\\|\\|\\{
'),'\\|\\|'))

解析过后的显示结果:

 

转载于:https://www.cnblogs.com/30go/p/9484836.html

你可能感兴趣的文章
sql自定义函数及C#中调用
查看>>
hdu 1555 How many days? (模拟)
查看>>
I'm a seeker
查看>>
移动 WebApp 开发 -- 笔记
查看>>
Oracle11g字符集AL32UTF8修改为ZHS16GBK详解
查看>>
Java-正则表达式的学习
查看>>
java 内存回收(GC)的方式
查看>>
解决浮动元素不在一行
查看>>
不修改原数组方法
查看>>
32位Windows 7环境安装Pydasm和Pydbg
查看>>
使用jQuery开发一个响应式超酷整合RSS信息阅读杂志
查看>>
Xcode-程序开发设计-02九宫格
查看>>
多线程篇-RunLoop
查看>>
ASP.NET MVC学习(四)之视图View
查看>>
CSS魔法(五)项目实战
查看>>
JavaScript常用函数总结
查看>>
Windows Defender 无法启动
查看>>
自动装箱和自动拆箱
查看>>
shell脚本编程常识
查看>>
Javascript 页面刷新
查看>>