在Pentaho Data Integration中实现row_number()分组排序行号逻辑
在Pentaho Data Integration中实现分组行号(对应SQL的
row_number() over (partition by category order by storename)) 要实现和SQL里row_number() over (partition by category order by storename)完全一致的分组行号逻辑,按以下步骤操作即可:
步骤1:先对数据排序
首先用**排序行(Sort Rows)**步骤整理数据,确保同category的行连续排列,且每个组内按storename排序:
- 将排序行步骤连接到你的数据源输出
- 排序字段配置:
- 第一优先级选
category(升/降序均可,只要保证同组行连续) - 第二优先级选
storename,按需求设置升序或降序
- 第一优先级选
步骤2:生成分组内的行号
这里提供两种实用方法,任选其一即可:
方法一:使用计算器(Calculator)步骤
- 添加计算器步骤连接到排序行的输出
- 配置计算器:
- 新建输出字段,比如命名为
row_num,类型选择整数(Integer) - 选择自定义Java表达式,输入以下代码:
if (previousRow != null && previousRow.getString("category").equals(getString("category"))) { counter += 1; } else { counter = 1; } counter - 勾选「在计算前初始化变量」,添加变量
counter,类型设为Integer,初始值为0
- 新建输出字段,比如命名为
方法二:使用用户定义Java表达式(User Defined Java Expression)步骤
- 添加该步骤连接到排序行的输出
- 新建输出字段
row_num,输入表达式:
该方法利用PDI内置的getRow() != null ? (previousRow != null && previousRow.get("category").equals(get("category")) ? incr("counter") + 1 : reset("counter", 0) + 1) : nullincr()和reset()函数自动维护分组计数器,代码更简洁
验证结果
运行转换后,每个category分组内的行将按storename排序,row_num字段会从1开始依次递增,完全匹配目标SQL的逻辑效果。
注意事项
- 排序步骤必须正确执行,否则分组内的行顺序混乱会导致行号错误
- 处理大数据量时,需为排序步骤分配足够内存,避免内存溢出
- 若转换为多线程运行,建议将该部分逻辑放在单线程分支中,防止变量计数器出现线程安全问题
内容的提问来源于stack exchange,提问作者Rajiya honey
相关产品推荐
相关产品推荐

