数仓json字段提取通用方案
统一方案
普通Json字符串可直接使用 方法1 或 方法2 get_json_object 或 json_tuple
Json数组直接使用udf函数,杜绝使用 方法3,目前数仓中多数是方法3,建议统一整改,消除隐患
背景
数据仓库目前的数据主要源于业务系统,数据结构内容繁杂,在做数据清洗时,常常会需要解析提取字符串类型的json数据,不同的人有不同的处理方法,虽然有些方法看起来能解决当前的需求,但却存在隐患,下面会给出具体的场景说明为什么,因此就需要一个通用的方案来解析这些Json,消除隐患,提升数据质量。
hive内置函数
1.get_json_object(string json_string, string path)
返回值:json字符串中的1个数据项
说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NUll,这个函数每次只能返回一个数据项

select get_json_object(jsonstr, '$.website') as website from tmp;

返回值:json字符串中的多个数据项
说明:解析json的字符串json_string,返回k1,k2,...,kn指定的内容。如果输入的json字符串无效,那么返回NUll,这个函数每次能返回多个数据项,需配合 LATERAL VIEW 一起使用
select
b.website
, b.name
from
tmp a
lateral view
json_tuple(a.jsonstr,'website','name') b as website,name
where XXX
注意1⚠️
json_tuple相较于get_json_object的优势就是一次可以解析多个Json字段。但是如果我们有个Json数组,这两个函数都无法处理
udf函数提取Json数组
归根结底,我们想要在hive中提取Json数组中的数据,首先得让它是个数组,而非字符串,那么想要通过hive内置函数将 String 类型的Json数组转成数组类型,就要用到分割符分割的方式去实现(目前好像也只能这么干),只要用到分割符,就会存在隐患
通过java程序,可规避使用分割符分割字符串数组的目的
/*
这是自定义函数,可将一个string类型的json数组,转成hive可接受的json数组
*/