ETL数据解析
创始人
2024-01-29 06:17:11
0

背景:

方法一:不借助于自定义函数实现 

方法二:不借助于自定义函数实现 

方法三:借助于自定义函数实现

背景:

表tmp.biz中只有id , biz_info 两个字段,目的是解析出字段biz_info里,key值对应的value值数据,以供需求方使用。

原始要清洗解析的数据 , 如下:

id='44788'时biz_info字段原样:
[{"visitHosCode":"H107201","visitFirstDeptName":"内科","visitSecondDeptCode":"4010504","visitSecondDeptName":"肝胆胰中医特色门诊","priority":50,"visitTimeText":"周二上午"},{"visitHosCode":"H107201","visitFirstDeptName":"内科","visitSecondDeptCode":"4010501","visitSecondDeptName":"脾胃病科一区门诊","priority":60,"visitTimeText":"周三上午"},{"visitHosCode":"H107201","visitFirstDeptName":"感染科","visitSecondDeptCode":"4140001","visitSecondDeptName":"肝炎门诊","priority":50,"visitTimeText":""},{"visitHosCode":"H107201","visitFirstDeptName":"国际部","visitSecondDeptCode":"G401501","visitSecondDeptName":"国际部脾胃病科一区","priority":5,"visitTimeText":"周二下午"}
]

方法一:不借助于自定义函数实现 


  原来1行数据,现在变为多行【因为这种方式有几个花括号,就变为几行 ; " 行数=花括号数,列数=1个花括号中key的个数 "】;
  有使用lateral view explode函数;

selectid,get_json_object(t3,'$.visitHosCode') as visitHosCode,get_json_object(t3,'$.visitFirstDeptName') as visitFirstDeptName,get_json_object(t3,'$.visitSecondDeptCode') as visitSecondDeptCode,get_json_object(t3,'$.visitSecondDeptName') as visitSecondDeptName,get_json_object(t3,'$.priority') as priority,get_json_object(t3,'$.visitTimeText') as visitTimeText
from
(selectid,if(item not like'%}%',concat(item,'}'),item) t3 --调整成正常的json串【因为item字段会有{ 或 ,{ 样式的数据】from (select id,biz_info,regexp_replace(biz_info,'\\]','')t1                            --去除左括号,regexp_replace(regexp_replace(biz_info,'\\]',''),'\\[','')t2   --去除右括号from tmp.biz)a lateral view explode(split(t2,'},'))t as item
)b
;

查询出的结果值:

id	    visithoscode	 visitfirstdeptname	   visitseconddeptcode    visitseconddeptname	 priority   visittimetext
44788   H107201	         内科	               4010504	              肝胆胰中医特色门诊	     50	         周二上午
44788   H107201	         内科	               4010501	              脾胃病科一区门诊	         60	         周三上午
44788   H107201	         感染科	               4140001	              肝炎门诊	             50	          
44788   H107201	         国际部	               G401501	              国际部脾胃病科一区	     5	         周二下午

 方法二:不借助于自定义函数实现 

   
  原来1行数据,现在还是为1行【因为没有使用lateral view explode函数】;
  需写多个get_json_object()函数;

select id,get_json_object(biz_info, "$.[0].visitHosCode")        as visitHosCode_1,get_json_object(biz_info, "$.[0].visitFirstDeptName")  as visitFirstDeptName_1,get_json_object(biz_info, "$.[0].visitSecondDeptCode") as visitSecondDeptCode_1,get_json_object(biz_info, "$.[0].visitSecondDeptName") as visitSecondDeptName_1,get_json_object(biz_info, "$.[0].priority")            as priority_1,get_json_object(biz_info, "$.[0].visitTimeText")       as visitTimeText_1,get_json_object(biz_info, "$.[1].visitHosCode")        as visitHosCode_2,get_json_object(biz_info, "$.[1].visitFirstDeptName")  as visitFirstDeptName_2,get_json_object(biz_info, "$.[1].visitSecondDeptCode") as visitSecondDeptCode_2,get_json_object(biz_info, "$.[1].visitSecondDeptName") as visitSecondDeptName_2,get_json_object(biz_info, "$.[1].priority")            as priority_2,get_json_object(biz_info, "$.[1].visitTimeText")       as visitTimeText_2,get_json_object(biz_info, "$.[2].visitHosCode")        as visitHosCode_3,get_json_object(biz_info, "$.[2].visitFirstDeptName")  as visitFirstDeptName_3,get_json_object(biz_info, "$.[2].visitSecondDeptCode") as visitSecondDeptCode_3,get_json_object(biz_info, "$.[2].visitSecondDeptName") as visitSecondDeptName_3,get_json_object(biz_info, "$.[2].priority")            as priority_3,get_json_object(biz_info, "$.[2].visitTimeText")       as visitTimeText_3,get_json_object(biz_info, "$.[3].visitHosCode")        as visitHosCode_4,get_json_object(biz_info, "$.[3].visitFirstDeptName")  as visitFirstDeptName_4,get_json_object(biz_info, "$.[3].visitSecondDeptCode") as visitSecondDeptCode_4,get_json_object(biz_info, "$.[3].visitSecondDeptName") as visitSecondDeptName_4,get_json_object(biz_info, "$.[3].priority")            as priority_4,get_json_object(biz_info, "$.[3].visitTimeText")       as visitTimeText_4
from tmp.biz

 查询出的结果值: 

id	    visithoscode	 visitfirstdeptname	   visitseconddeptcode    visitseconddeptname	 priority   visittimetext
44788   H107201	         内科	               4010504	              肝胆胰中医特色门诊	     50	         周二上午
44788   H107201	         内科	               4010501	              脾胃病科一区门诊	         60	         周三上午
44788   H107201	         感染科	               4140001	              肝炎门诊	             50	          
44788   H107201	         国际部	               G401501	              国际部脾胃病科一区	     5	         周二下午

缺点:需要写多个get_json_object()函数

方法三:借助于自定义函数实现

 
  原来1行数据,现在变为多行【因为这种方式有几个花括号,就变为几行 ; " 行数=花括号数,列数=1个花括号中key的个数 "】;
  有使用lateral view explode 与 lateral view json_tuple函数; hue查询工具中不能运行 , 需要再Airflow调度中才能运行;
 

CREATE TABLE if not exists `tmp.biz_result`(`id` string, `visithoscode` string, `visitfirstdeptname` string, `visitseconddeptcode` string, `visitseconddeptname` string, `priority` string, `visittimetext` string
)COMMENT '解析后的结果表'
stored as parquet
location '/hive/xxx/tmp.db/biz_result' 
TBLPROPERTIES ('parquet.compression'='SNAPPY');--需要手写自定UDF , 之后调用自定义的UDF函数
add jar /home/...路径/udf/tmp/json_array.jar;
create temporary function json_array as 'com.benmu.udf.Json_array';insert overwrite table tmp.biz_result
select
id,visitHosCode,visitFirstDeptName,visitSecondDeptCode,visitSecondDeptName,priority,visitTimeText
from
(
select 
id,biz_info
from
tmp.biz
)a
lateral view explode(json_array(biz_info)) t as item
lateral view json_tuple(item,'visitHosCode','visitFirstDeptName','visitSecondDeptCode','visitSecondDeptName','priority','visitTimeText')t1 as visitHosCode,visitFirstDeptName,visitSecondDeptCode,visitSecondDeptName,priority,visitTimeText
;

查询出的结果值: 

hive> select * from tmp.biz_result;id	    visithoscode	 visitfirstdeptname	   visitseconddeptcode    visitseconddeptname	 priority   visittimetext
44788   H107201	         内科	               4010504	              肝胆胰中医特色门诊	     50	         周二上午
44788   H107201	         内科	               4010501	              脾胃病科一区门诊	         60	         周三上午
44788   H107201	         感染科	               4140001	              肝炎门诊	             50	          
44788   H107201	         国际部	               G401501	              国际部脾胃病科一区	     5	         周二下午


 

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...