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

时间:2018-09-19 12:20:19

标签: scala spark-structured-streaming

我有一个流数据,从kafka传入dataFrame。 我想删除基于ID的重复项,并根据时间戳保留最新记录。

样本数据如下:

restrict

我期望的输出是:

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

旧的重复项将被删除,并且根据timestamp字段仅保留最近的记录。

我正在为时间戳字段使用水印。 我尝试使用“ df.removeDuplicate”,但它可以使较旧的记录保持完整,并且任何新记录都将被丢弃。

当前代码如下:

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

如何实现自定义dedup方法,以便将最新记录保留为唯一记录?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

在删除重复项之前先对timestamp列进行排序。

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