Hive字符串数组json类型取某字段再列转行

本文介绍如何使用HiveSQL从名为`code_content`的表中提取JSON数组的`code`字段,通过正则表达式、split、explode和lateralview函数将数据转换为单行字符串。作者详细解释了每一步操作及其目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、原始数据

acctcontent
1232313[{"name":"张三","code":"上海浦东新区89492jfkdaj\r\n福建的卡"...},{"name":"狂徒","code":"select * from table where aa=1\r\n and a=12"...},{...}]
......

二、需求

 上述数据表名code_content,把json中code内容全都取出来拼接成一行数据,最终效果:

acctnew_content
1232313上海浦东新区89492jfkdaj\r\n福建的卡\u0001select * from table where aa=1\r\n and a=12
......

三、解析思路

四、实现方法

1.sql

select acct,concat_ws('\u0001',collect_list(t.code)) code
from 
(
select acct,get_json_object(a_json,'$.code') code
from
(
select acct,
split(regexp_replace(regexp_extract(code,'(^\\[)(.*?)(\\]$)',2),'\\},\\{','\\}|\\{'),'\\|') as t_code
from code_content
where dt=20230823
) a
lateral view explode(t_code) code_content_tab as a_json
) t
group by acct

2.sql解释:

  • regexp_extract(code,'(^\\[)(.*?)(\\]$)',2):用正则取出数组里的json
  • regexp_replace:替换},{为}|{,方便切割因为,号一般语句里会比较多
  • split:切割成数组
  • explode:函数中的参数传入的是arrary数据类型的列名,通常,explode函数会与lateral view一起结合使用
  • lateral view:Lateral View配合 split, explode 等UDTF函数一起使用,它能够将一列数据拆成多行数据,并且对拆分后结果进行聚合,即将多行结果组合成一个支持别名的虚拟表。
  • get_json_object(a_json,'$.code'):获取json字段value
  • concat_ws('\u0001',collect_list(t.code)):“列转行”

参考:

Hive SQL中的 lateral view 与 explode(列转行)以及行转列_sql explode_卖山楂啦prss的博客-优快云博客

hivesql解析json数组并拆分成多行_hive sql怎么对一个数组进行分行_Time Woods的博客-优快云博客

### Hive SQL 实现转行 #### 使用 LATERAL VIEW 和 UDTF 函数 在Hive中,可以利用`LATERAL VIEW`配合用户自定义表生成函数(UDTF),如`explode()`来实现转行的功能。对于存储有逗号分隔字符串或其他形式集合数据的单个字段,通过这些方法能够将其拆分为多行记录。 例如,当有一个包含多个行业的单一表示某公司所属的不同业务领域时,可以通过下面的方式把这一项展开成各自独立的一条新纪录: ```sql SELECT id, industry FROM company_industries ci LATERAL VIEW explode(split(industry_list, ',')) exploded_table AS industry; ``` 此查询语句会将`company_industries`表中的每一个由逗号分割开来的行业名称作为单独的结果集返回,并赋予其一个新的别名为`exploded_table`以便后续引用[^1]。 #### 处理复杂结构化数据 如果面对的是更复杂的嵌套数组或映射类型,则可采用相应的特定函数来进行解析。比如针对JSON格式的数据源,可能就需要借助于`get_json_object()`或是`json_tuple()`这样的辅助工具先行提出目标键对应的值之后再做进一步变换处理[^5]。 #### 示例:基于行业字段进行转换 假设有一张表格叫做`businesses`,其中某一为`industries`,该内保存着以英文半角逗号`,`相连的企业所涉及的所有产业类别信息。为了更好地分析各企业涉足的具体方向,现在希望把这些组合起来的信息分别罗出来形成新的记录。 ```sql CREATE TABLE businesses ( business_id STRING, name STRING, industries STRING ); INSERT INTO businesses VALUES ('001','ExampleCorp','Tech,BioPharma,Retail'); INSERT INTO businesses VALUES ('002','SampleInc.','Finance,Edu'); -- 下面是执行到行转化的实际命令 SELECT b.business_id, b.name, i.industry FROM businesses b LATERAL VIEW explode(split(b.industries, ',')) indv AS industry; ``` 上述代码片段创建了一个简单的测试环境并展示了如何运用`split()`加上`explode()`以及`LATERAL VIEW`语法完成从单个复合型属性向多条简单实体转变的过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值