Talend按最新日期过滤行:如何保留每个id对应最新时间戳记录
按id分组取最新timestamp记录的FilterRow实现方案
结论
完全可以使用FilterRow组件实现该需求,你已经完成的「id升序、timestamp降序」排序是这个方案的完美前置条件。
实现逻辑
排序后同一个id的所有记录会连续排列,且排在最前面的记录就是该id对应timestamp最新的记录,我们只需要保留每个id出现的第一条记录,过滤掉后续同id的所有记录即可。
具体操作步骤
- 首先在作业中初始化一个全局变量
previous_id,初始值设为null,用于存储上一条被保留的记录的id - 将排序后的数据流连接到
tFilterRow组件,切换为高级过滤模式,写入如下判断逻辑:
// 当前id和上一条保留的id不同时,保留当前记录并更新存储的id if (!id.equals(globalMap.get("previous_id"))) { globalMap.put("previous_id", id); return true; } // 同id的后续记录直接过滤 return false;
- 从
tFilterRow输出的数据流就是每个id对应最新timestamp的唯一结果。
补充优化建议
- 该方案时间复杂度为O(n),相比用
tAggregateRow按id分组求timestamp最大值的方案效率更高,不需要额外的聚合计算开销 - 如果你的id字段是数值类型,可以把上面的
equals判断替换为==判断,性能会更好
内容的提问来源于stack exchange,提问作者Hans
相关产品推荐
相关产品推荐

