TopN算子和去重算子 Deduplication 的sql写法比较相近,从下图中的蓝色部分可以看出差别。
如果order by 后的字段不为时间属性字段,且sql 中有 rownum <= N 子句,则flink会将其解析为TopN的查询。
如果如果order by 后的字段为时间属性字段,且sql 中有 rowNum = 1子句,则flink会将其解析为Deduplication 的查询。
(官网链接: flink sql中的topN和去重对比)
去重算子dedupilcation 是 TopN的一种特殊情况,相比于TopN算子专门做了优化,性能有比较大的提升。常用于按照主键去重 或者 按照主键保留最新数据的情景。
在dedupilcation的sql写法中, 由于order by 后的时间字段有 处理时间和事件时间,依照升序或者降序的不同,加上可能出现的数据乱序情况,输出流可能分为回撤流Retract和追加流Append-only。
在一些场景下如需要在结果数据流上进行时间窗口计算,则上图中的 processingTime + Asc组合对应的追加流 Append-only是必须的。这种情况下对应的dedupilcation的sql写法如下。