Impala实现group_concat分组排序拼接

首先,先声明:常见数据库Oracle、Mysql、MSsql等,是支持group_concat中使用order by的,但是Impala是不支持group_concat中使用order by的(百度了、想尽办法折腾了)

因为业务上强烈要求进行数据排序,所以我也是绞尽脑汁,最后找到了解决方法:拒绝order by,牺牲一点性能,采用 row_number + concat_ws + group_concat,可以达到预期效果

实现步骤:

1、先完成聚合前的数据筛选,完成数据过滤

2、开窗,row_number进行数据排序,添加序号,并cast转为字符串;

3、多字段组合,concat_ws进行聚合字段和序号字段的拼接,并replace掉序号为空串(concat_ws只支持字符串)

4、单字段聚合,group_concat进行最后的数据拼接

5、输出结果,检查完即为预期结果,perfect!

注意:在步骤2中,如果不用row_number,只用order by排序,最后结果集还是会回到原始顺序,无法完成排序聚合

如下演示一段示例,大家可以自行复制到本机运行,检查运行结果进行验证

with sou as (
select '1' code union all
select '3' code union all
select '4' code union all
select '2' code union all
select '5' code ),

dea as (select code,cast(row_number() over(order by code) as string) rowid from sou),

res as (select group_concat(concat_ws('',code,replace(rowid,rowid,''))) codes from dea)

select * from res

-- 输出结果:
-- 1, 2, 3, 4, 5

如上,通过上述实现步骤,就可以实现Impala的分组排序拼接;

上述逻辑显然会牺牲一点查询效率,所以如果是业务强烈要求、或者数据量不会太大的话,才建议这么处理

以上就是实现Impala分组后字符串按顺序拼接的方法,希望能帮助到大家;如果大家有其他方法在impala中进行group_concat的排序拼接,欢迎评论,共同学习

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值