从Hive函数collect到MySQL函数group_concat

问题背景:

在工作中遇到数据分析时对结果展示的要求。需求如下: 查询在关注时间窗口下(7日)公司相同账户与不同交易对手账户之间的交易行为。 原本预计的展示结果为:

公司账户 公司信息 交易对手账户 交易对手信息 交易信息(日期等)
66666666 AAA 99999991 BBB1 2025-11-04
66666666 AAA 99999992 BBB2 2025-11-06
66666666 AAA 99999993 BBB3 2025-11-15
66666666 AAA 99999994 BBB4 2025-11-22
88888888 AAA 99999995 BBB5 2025-11-26
88888888 AAA 99999996 BBB6 2025-12-01
88888888 AAA 99999997 BBB7 2025-12-30
88888888 AAA 99999998 BBB8 2026-01-01
88888888 AAA 99999999 BBB9 2026-01-04

由于重复数据太多不便于业务人员查看数据之间的关系,经与业务人员讨论后决定调整为如下展示方式:

公司账户 公司信息 相关数据
66666666 AAA 交易对手账户:99999991 交易对手信息:BBB1 交易信息(日期等):2025-11-04 交易对手账户:99999992 交易对手信息:BBB2 交易信息(日期等):2025-11-06
66666666 AAA 交易对手账户:99999993 交易对手信息:BBB3 交易信息(日期等):2025-11-15 交易对手账户:99999994 交易对手信息:BBB4 交易信息(日期等):2025-11-22
88888888 AAA 交易对手账户:99999995 交易对手信息:BBB5 交易信息(日期等):2025-11-26 交易对手账户:99999996 交易对手信息:BBB6 交易信息(日期等):2025-12-01
88888888 AAA 交易对手账户:99999997 交易对手信息:BBB7 交易信息(日期等):2025-12-30 交易对手账户:99999998 交易对手信息:BBB8 交易信息(日期等):2026-01-01 交易对手账户:99999999 交易对手信息:BBB9 交易信息(日期等):2026-01-04

解决方法:

这样的展示方式就需要一个合适的聚合函数来进行数据内容汇总。 之前常使用Hive开发这种情况多用collect,但是本次使用的MySQL使用的时候发现没有这个函数。后面决定使用group_concat。 group_concat嵌套concat_ws可以很好的达到上面的效果:

sql 复制代码
    ,group_concat(concat_ws(''  
         ' 交易对手账户:',account  
        ,' 交易对手信息:',account_info  
        ,' 交易信息(日期等):',trade_date  
  ) ORDER BY trade_date SEPARATOR ';\n') as 相关数据

但是使用起来发现如果数据太长会有数据截断的问题。因此如果数据量比较大需要注意以下设置:

sql 复制代码
-- 查看和设置 GROUP_CONCAT 相关参数
SHOW VARIABLES LIKE 'group_concat_max_len';

-- 临时设置最大长度(默认1024字节) 会话级配置
SET SESSION group_concat_max_len = 1000000;

-- 在查询中设置
SET @@group_concat_max_len = 1000000;

以上就是对于数据汇总展示的一个总结。希望能帮助到需要展示思路 与需要聚合思路的朋友。

番外:

后面了解到也可以通过json的方式来展示这部分数据:

sql 复制代码
JSON_ARRAYAGG(  
    JSON_OBJECT(  
         '交易对手账户',account  
        ,'交易对手信息',account_info  
        ,'交易信息(日期等)',trade_date 
    )  
) as 相关数据

不过问题是展示的字段顺序不可控。这个问题还没有解决的好办法,如果有大佬看到请多做指点。

相关推荐
程序员塔塔喵5 小时前
【MySQL篇|第一篇】索引失效的情况
数据库·mysql·索引失效
paopaokaka_luck5 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
paopaokaka_luck8 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428048 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
ha_lydms10 小时前
AnalyticDB MySQL 技术架构
大数据·hadoop·mysql·adb·spark·dataworks·1024程序员节
Random Glow12 小时前
聚簇索引 vs 二级索引:回表、覆盖索引、索引下推
数据库·mysql·性能优化·innodb·1024程序员节·索引优化
要开心吖ZSH13 小时前
一次线上锁风暴复盘:号源表大范围 DELETE 的隐患与分批删除改造
数据库·mysql·行锁·1024程序员节·间隙锁·lockwaittimeout
John_Hui16 小时前
MySQL 进阶知识
数据库·sql·mysql·1024程序员节
Random Glow16 小时前
一条 SQL 从输入到返回,中间经历了什么
数据库·后端·mysql·性能优化·innodb·1024程序员节
何中应16 小时前
MySQL 连接驱动单独下载的两种方式
数据库·mysql·maven