【发布时间】:2020-10-25 13:18:36
【问题描述】:
Spark dropDuplicates 保留第一个实例并忽略该键的所有后续出现。是否可以在保留最近出现的情况下删除重复项?
例如,如果下面是我获得的微批次,那么我想保留每个国家/地区的最新记录(按时间戳字段排序)。
batchId:0
Australia, 10, 2020-05-05 00:00:06
Belarus, 10, 2020-05-05 00:00:06
batchId:1
Australia, 10, 2020-05-05 00:00:08
Belarus, 10, 2020-05-05 00:00:03
那么batchId 1之后的输出应该低于-
Australia, 10, 2020-05-05 00:00:08
Belarus, 10, 2020-05-05 00:00:06
更新 1 这是我拥有的当前代码
//KafkaDF is a streaming dataframe created from Kafka as source
val streamingDF = kafkaDF.dropDuplicates("country")
streamingDF.writeStream
.trigger(Trigger.ProcessingTime(10000L))
.outputMode("update")
.foreachBatch {
(batchDF: DataFrame, batchId: Long) => {
println("batchId: "+ batchId)
batchDF.show()
}
}.start()
我想输出所有新行或时间戳大于迄今为止处理的先前批次中的任何记录的所有行。下面的例子
batchId: 0 之后 - 这两个国家都是第一次出现,所以我应该让它们输出
Australia, 10, 2020-05-05 00:00:06
Belarus, 10, 2020-05-05 00:00:06
batchId: 1 之后 - 白俄罗斯的时间戳比我们在第 0 批中收到的时间戳要旧,所以我不会在输出中显示它。显示澳大利亚是因为它的时间戳比我目前看到的更新。
Australia, 10, 2020-05-05 00:00:08
现在假设 batchId 2 将两条记录都作为迟到的记录出现,那么它不应该在该批次的输出中显示任何内容。
输入batchId:2
Australia, 10, 2020-05-05 00:00:01
Belarus, 10, 2020-05-05 00:00:01
batchId: 2 之后
.
Update-2
为每个批次添加输入和预期记录。用红色标记的行将被丢弃,并且不会在输出中显示为具有相同国家名称的另一行,并且在之前的批次中可以看到更近的时间戳
【问题讨论】:
-
我发现了一个问题,它确切地询问了我在寻找什么,但不幸的是,没有答案。 stackoverflow.com/questions/50823468/… 全部,我正在寻找的是 dropDuplicates in reverse order 以便它保留最新记录而不是第一个
-
你在哪里写数据??
-
@Srinivas 我将把它写到像 Oracle 这样的持久数据库中,但我不想使用查找 oracle 来解决它,因为我想在开始时过滤迟到的记录
-
迟到的记录意味着持续多长时间..想想两天前回来的相同记录今天可以回来..你打算怎么处理??
-
我可以放心地假设我的活动不会迟到一个多小时。
标签: apache-spark spark-streaming spark-structured-streaming drop-duplicates