Scala 结构化流式自定义重复数据消除

Scala 结构化流式自定义重复数据消除,scala,spark-structured-streaming,Scala,Spark Structured Streaming,我有一个从卡夫卡传入数据帧的流数据。 我想删除Id中的重复项,并根据时间戳保留最新记录 示例数据如下所示: Id Name count timestamp 1 Vikas 20 2018-09-19T10:10:10 2 Vijay 50 2018-09-19T10:10:20 3 Vilas 30 2018-09-19T10:10:30 4 Vishal 10 2018-09-19T10:10:40 1 Vi

我有一个从卡夫卡传入数据帧的流数据。 我想删除Id中的重复项,并根据时间戳保留最新记录

示例数据如下所示:

Id  Name    count   timestamp
1   Vikas   20      2018-09-19T10:10:10
2   Vijay   50      2018-09-19T10:10:20
3   Vilas   30      2018-09-19T10:10:30
4   Vishal  10      2018-09-19T10:10:40
1   Vikas   50      2018-09-19T10:10:50
4   Vishal  40      2018-09-19T10:11:00
1   Vikas   10      2018-09-19T10:11:10
3   Vilas   20      2018-09-19T10:11:20
我期望的结果是:

Id  Name    count   timestamp
1   Vikas   10      2018-09-19T10:11:10
2   Vijay   50      2018-09-19T10:10:20
3   Vilas   20      2018-09-19T10:11:20
4   Vishal  40      2018-09-19T10:11:00
根据时间戳字段,删除旧的重复项,只保留最近的记录

我正在为时间戳字段使用水印。 我尝试过使用“df.removeDuplicate”,但它保持了旧记录的完整性,任何新记录都会被丢弃

目前的代码如下:

df = df.withWatermark("timestamp", "1 Day").dropDuplicates("Id", "timestamp")
我们如何实现自定义重复数据消除方法,以便将最新记录作为唯一记录保存


非常感谢您的帮助。

在删除重复项之前,请先对时间戳列进行排序

df.withWatermark("timestamp", "1 Day")
  .sort($"timestamp".desc)
  .dropDuplicates("Id", "timestamp")

“在流式数据帧/数据集上不支持排序,除非它在完全输出模式下的聚合数据帧/数据集上。”我们使用水印,因此在我们的情况下,它不是一个完整的输出模式。这里有任何解决方案吗?@BluePhantom现在我们已经到了2020年,你能找到任何解决方案吗?嗯,我在卡夫卡等的其他事情上,但目前没有火花,卡夫卡整合。可能还有其他问题需要解决@康涅坦