欢迎光临散文网 会员登陆 & 注册

数仓json字段提取通用方案

2023-01-16 14:00 作者:Koy1  | 我要投稿

统一方案

  1. 普通Json字符串可直接使用 方法1 方法2  get_json_object 或 json_tuple

  2. 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数组

*/


数仓json字段提取通用方案的评论 (共 条)

分享到微博请遵守国家法律