如何生成group_id列以实现批量聚合行数据
如何生成group_id列以实现批量聚合行数据
这个需求在批量聚合场景里挺常见的,核心思路就是利用整数除法给每行分配对应的分组ID,前提是你的id列是连续递增的(就像你例子里的1到6那样)。下面给你几种常用SQL环境下的实现方式,直接就能用:
固定批量大小的情况
比如你例子里的batchSize=2或3,直接用FLOOR((id - 1)/批量大小) + 1就能算出group_id。这里减1是为了让第一组的计算从0开始,避免第一组多算一行,加1是让分组ID从1开始(和你想要的结果一致)。
第一步:生成group_id列
以batchSize=2为例,SQL语句如下:
SELECT id, values, FLOOR((id - 1)/2) + 1 AS group_id FROM your_table;
执行后就能得到你想要的带group_id的中间表,完全匹配你给出的示例结果。
第二步:按group_id聚合
拿到中间表后,直接分组聚合就行:
SELECT group_id, collect_list(values) AS values_list FROM ( SELECT id, values, FLOOR((id - 1)/2) + 1 AS group_id FROM your_table ) t GROUP BY group_id;
把SQL里的2换成3,就能得到batchSize=3时的聚合结果。
处理非连续id的情况
如果你的id列不是连续递增的(比如有缺失值),那可以先给每行生成一个连续的行号,再用行号来计算group_id:
SELECT id, values, FLOOR((rn - 1)/2) + 1 AS group_id FROM ( SELECT id, values, row_number() OVER (ORDER BY id) AS rn FROM your_table ) t;
这样不管id有没有缺失,都能按数据的顺序来批量分组。
动态批量大小的情况
如果批量大小需要动态传入(比如参数化场景),以Spark SQL为例,可以先设置变量再使用:
SET batchSize=2; SELECT group_id, collect_list(values) AS values_list FROM ( SELECT id, values, FLOOR((id - 1)/${batchSize}) + 1 AS group_id FROM your_table ) t GROUP BY group_id;
其他支持变量的SQL环境(比如Hive)也可以用类似的参数替换方式实现。
备注:内容来源于stack exchange,提问作者Vasiliy Pumpkin
相关产品推荐
相关产品推荐

