当前位置: 首页 > 科技观察

Hive完美解析Json数组的函数

时间:2023-03-17 00:37:03 科技观察

在后台大数据ETL(Extract-Transfer-Load)流程的Transfer阶段,需要对json字符串数据进行转换和“扁平化”。反对!超级好用的Hive内置的json解析功能。在文章中,我已经详细介绍了get_json_object和json_tuple函数是如何有效解析json字符串的,美中不足的是这两个函数无法解析json数组,只能解析单个json字符串。下面介绍Hive中json数组常用的解析函数及其详细使用方法。JSON数组解析:需求1数据准备例如:Hive中有一张test_json表,表中json_data字段内容如下:基于上述json_data数据,现在需要解析上述json字符串数据转换成如下结构化数据:在解析之前,首先让我们学习一下下面两个函数的使用方法。函数用法1、explode函数语法explode(Array|Map)表示explode()函数接收数组或map类型的数据作为输入,然后将数组或map中的元素以每一行的形式输出。它将Hive的一列中的复杂数组或map结构拆分成多行显示,也称为列转换函数。数组测试sql语句示例:selectexplode(array('user_id','name','age'));执行结果:maptestsql语句:selectexplode(map('user_id',1,'name','rocky','age',18));执行结果:2、regexp_replace函数语法regexp_replace(strA,strB,strC)解释语法含义:将字符串A中满足正则表达式B的部分替换为C。注意:当有一些特殊的字符串A中的字符,正则表达式B中使用转义字符。sql语句示例:selectregexp_replace('helloworld!','\\|\\!','');执行结果:3.具体函数的应用在了解了explode函数和regexp_replace函数的使用规则后,现完成上述数据准备中提出的解析需求。第一步分析:将json数组拆分成多行SQL语句:SELECTexplode(split(regexp_replace(regexp_replace('[{"user_id":"1","name":"小林","age":16},{"user_id":"2","name":"小刘","age":18},{"user_id":"3","name":"小明","age":20}]','\\[|\\]',''),去掉json数组两边的方括号'\\}\\,\\{','\\}\\;\\{'),将json数组元素之间的逗号替换为分号'\\;')以分号作为分隔符(split函数使用分号作为分隔符));执行结果:第2步分析:json数组keytocolumnfieldsql语句:selectjson_tuple(json,'user_id','name','age')from(selectexplode(split(regexp_replace(regexp_replace('[{"user_id":"1","name":"小林","age":16},{"user_id":"2","name":"小刘","age":18},{"user_id":"3","name":"小明","age":20}]','\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),'\\;'))为json)tmp;执行结果:json数组分析:需求2数据准备例如:Hive中有一张data_json表,表中goods_id和str_data字段内容如下:根据上述goods_id和str_data数据,现在需要将上面的json字符串数据解析成如下结构数据:在解析之前,先了解一下下面两个函数的用法函数应用1.横向视图功能说明横向视图用于配合UDTF如split和explode使用它,可以将一列数据拆分成多行数据,并在此基础上对拆分后的数据进行聚合。横向视图首先为原始表的每一行调用UDTF。UDTF会将一行拆分为一行或多行,横向视图正在组合结果生成支持别名表的虚拟表。例如:Hive中有一张page_ads表,该表的数据结构如下:page_name表示页面名称,ads_id表示广告的id,多个id之间用逗号分隔。需求:统计所有广告id在所有页面出现的次数。第一步分析:拆分广告id拆分sql语句:SELECTpage_name,ads_idFROMpage_adsLATERALVIEWexplode(ads_id)adTableASadid;split结果:第二步分析:aggregatestatisticsaggregatestatisticssql语句:SELECTadid,count(1)FROMpage_adsLATERALVIEWexplode(ads_id)adTableASadidGROUPBYadid;统计结果:2.具体使用函数分析data_json表的sql语句如下:selectgoods_id,get_json_object(sale_json,'$.sold')assoldfromdata_jsonLATERALVIEWexplode(split(goods_id,','))goodsasgoods_idLATERALVIEWexplode(split(regexp_replace(regexp_replace(json_str,'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),'\\;'))salesassale_json;注意:上面的语句是3*3笛卡尔积的结果,所以这种方法不适用于数据量大的bigcase。执行结果如下: