Hive中多行合并成一行以及一行扩展成多行的方法

本文介绍了如何在Hive中使用collect_list和explode函数处理数据。通过collect_list可以将多行合并成一行,例如将col1和col2相同值的col3合并。而explode则用于一行扩展成多行,例如将col3的数组展开。对于多列相同位置的一行展开,可以使用posexplode函数。详细操作和示例提供了清晰的指导。

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

1. 多行合并成一行:使用函数collect_list
假如现在数据表table1如下所示:
col1   col2    col3
A        B         1
A        B         2
A        C         3
A        C         4
我们想将col1和col2值相同的col3合并成一行,得到如下的数据表,使用函数collect_list
Col1    col2    col3
A       B       1,2
A       C       3,4

select col1,col2,concat_ws(“,” , collect_list(cast(col3 as string))) from table1 group by col1, col2


我们将col3转换为string,是因为concat_ws函数只接受string或者array<string>的数据类型

还有一个collect_set,跟collect_list的区别是,前者会去重后再合并在一起。后者不会。

2. 一行扩展成多行
2.1 现有表table2如下:
Col1    col2    col3
A       B       [1,2]
A       C       [3,4]
我们想要
Col1   col2    col3
A      B       1
A      B       2
A      C       3
A      C       4
也就是把col3展开
使用函数explode。由于explode中不能select其他列,比如
 

select col1, col2, explode(col3) from table2

是不被允许的
只有select explode(col3)是被允许的,为了解除这个限制,我们要将lateral view和explode连起来用
上面需要的实现:

select col1, col2, col3_explode from table2 
lateral view explode(col3) t as clo3_explode


2.2 多列相同位置的一行展开成多行
现有表table3如下所示:
Col1    col2    col3    col4
A         B       [1,2]     [a,b]
A         C       [3,4]     [c,d]
我们想要
Col1    col2    col3    col4
A         B         1        a
A         B         2        b
A         C         3        c
A         C         4        d
使用函数posexplode
具体语法如下:
 

select col1, col2, col3_explode, col4_explode
from table3
lateral  view  posexplode(col3) t as col3_index, col3_explode
lateral  view  posexplode(col4) t as col4_index, col4_explode
where col3_index = col4_index

参考链接:
explode和collect_list:
https://my.oschina.net/u/3204727/blog/1571101
posexplode:
Hive--sql中的explode()函数和posexplode()函数-优快云博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skj1995

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值