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

{"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<Map<string,string>>
)
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,partlist
lateral view explode(split(regexp_replace(regexp_extract(partlist,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|')) partlist as p
lateral view json_tuple(p,'code','uname') p as code,uname

这里比较重要的一段是:

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

解析过后的显示结果:

(Hive)史上最难解析的json字符串解析出来了!!的更多相关文章

  1. Java基础-处理json字符串解析案例

    Java基础-处理json字符串解析案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名开发人员,想必大家或多或少都有接触到XML文件,XML全称为“extensible ...

  2. python解析复杂json字符串

    因为项目需要,公司领导对提出了接口测试的要求,因此作为一个测试人员,我第一时间就想到了jmeter这个利器,前面文章也有说明过怎么用jmeter做http协议的接口测试,这里我不再做讲解,此篇主要讲解 ...

  3. Gson解析复杂JSON字符串的两种方式

    JSON解析可以使用的库: JSONObject(源自Android官方). Gson(源自Google). Jackson(第三方开源库). FastJSON(第三方开源库). 本文例子使用Goog ...

  4. 前台的js对象数组传到后台处理。在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>

    前台的js对象数组传到后台处理.在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>

  5. JSON.parse() 方法解析一个JSON字符串

    JSON.parse() 方法解析一个JSON字符串,构造由字符串描述的JavaScript值或对象.可以提供可选的reviver函数以在返回之前对所得到的对象执行变换. 语法EDIT JSON.pa ...

  6. 基于开源库jsoncpp的json字符串解析

    json(JavaScript Object Notation)是一种轻量级高效数据交换格式.相比于XML,其更加简洁,解析更加方便.在实习期间,我负责的程序模块,多次使用到json进行数据传输.由于 ...

  7. VBScript把json字符串解析成json对象的2个方法

    这篇文章主要介绍了VBScript把json字符串解析成json对象的2个方法,本文通过MSScriptControl.ScriptControl和jscript实现,需要的朋友可以参考下 asp/v ...

  8. 复杂JSON字符串解析,可以少走弯路

    发现一个好文章:装载至http://www.verejava.com/?id=17174254038220 package com.json5;    import org.json.JSONArra ...

  9. 史上最全面,清晰的SharedPreferences解析

    基础用法获取Sp:getput监听器原理分析获取SharedPreferences构造SharedPreferencesgetX原理分析putX原理分析创建editorputStringapplyap ...

随机推荐

  1. Knockout: radio选项切换引发click事件的一点总结

    1.场景:如下图,当选择定期存款时,输入框右边出现红色的必输项星号,当选择活期存款时,不再出现该星号. 2.思路一:不使用knockout,直接用click事件,就可以实现这个需求,代码如下: < ...

  2. C#基础课程之三循环语句

    for循环: ; i < ; i++) { Console.WriteLine("执行"+i+"次"); } while循环: while (true) ...

  3. UI测试后生成测试报告,利用shell脚本上传svn

    ui测试后生成测试报告,把报告保存在某一个固定路径 shell脚本把这个报告上传 #!/bin/bash -ile #svn下载文件 #svn checkout http://svn.xxx.com/ ...

  4. js json转url参数

    var json = { sh: '上海' } var params = Object.keys(json).map(function (key) { // body... return encode ...

  5. 【python】Python 资源大全中文版

    申明:感谢原作者的整理与分享,本篇文章分享自:https://www.jianshu.com/p/9c6ae64a1bd7 GitHub 上有一个 Awesome - XXX 系列的资源整理,资源非常 ...

  6. 本地启动spark-shell

    由于spark-1.3作为一个里程碑式的发布, 加入众多的功能特性,所以,有必要好好的研究一把,spark-1.3需要scala-2.10.x的版本支持,而系统上默认的scala的版本为2.9,需要进 ...

  7. msf web_delivery模块攻击

    目标机:win7                    ip:192.168.31.136 攻击机:kai liunx                      ip:192.168.31.54 一. ...

  8. php分享十八七:mysql基础

    mysql操作数据库代码: $link = @mysql_connect('localhost:3306', 'root', 'root') or die(mysql_error()); mysql_ ...

  9. Darwin Streaming Server for Windows 安装

    最近搞流媒体相关的项目,于是打算在局域网搭建一个流媒体服务器.本以为很快搞定的,但是,在安装过程中还是折腾了一番. 现把安装流程记下来: 一.下载 Darwin Streaming Server fo ...

  10. [svc]java初步

    J2EE.J2SE 和 J2ME 三者的区别有哪些? J2SE, 主要是桌面软件开发,包括swing 等.是后面2个的基础,但是我们不用它做桌面开发.只学习语法. J2EE,网站开发,servlet. ...