如何在ADF数据流中实现基于条件的两步排序逻辑
ADF数据流两步排序去重解决方案
核心思路
放弃聚合转换,改用窗口转换+筛选的组合逻辑,精准选出符合双重排序规则的唯一行,彻底避免随机取值问题。
具体操作步骤
- 添加窗口转换并接入源数据:
- 分区配置:将
id设为「Partition by」字段,确保相同id的行被划分到同一组。 - 排序规则:在「Order by」中依次设置两个降序条件:
date1(降序)、date2(降序)。这样每个id组内,date1最大的行排在首位;若date1相同,则date2最大的行排在首位。 - 新增行号列:在窗口转换的列设置中,新增一列(例如命名为
row_num),使用表达式rowNumber()。该函数会给每个窗口内的行按排序顺序编号,第一行就是我们需要保留的目标行。
- 分区配置:将
- 添加筛选转换并接入窗口转换的输出:
- 设置过滤条件为
row_num == 1,只保留每个id组内排序后的第一行。
- 设置过滤条件为
- (可选)添加选择转换,移除临时生成的
row_num列,只保留业务所需的id、date1、date2及其他字段。
原聚合方法无效的原因
聚合转换仅对分组后的列执行聚合计算(如max(date1)),若直接选取非聚合列(比如原始date2),ADF会随机从分组内挑选某一行的值,无法保证该值与max(date1)、max(date2)属于同一行,最终导致结果不符合预期。而窗口转换先完成组内排序,再通过行号精准锁定目标行,能确保拿到完整的符合规则的数据行。
内容的提问来源于stack exchange,提问作者Nezko1
相关产品推荐
相关产品推荐

