在Spark 2.2.0中,我正在从Kafka读取数据,该数据具有2列“ textcol ”和“ time ”。 “时间”列具有最新的处理时间。我想在20秒的固定窗口持续时间内获得“ textcol”的唯一值的计数。我的触发时间是10秒。
例如,如果在20秒的窗口持续时间内,trigger1的textcol = a,trigger2的textcol = b,那么我希望20秒后输出如下:
textcol cnt
a 1
b 1
我将以下代码用于数据集ds
ds.groupBy(functions.col("textcol"),
functions.window(functions.col("time"), "20 seconds"))
.agg(functions.count("textcol").as("cnt"))
.writeStream().trigger(Trigger.ProcessingTime("10 seconds"))
.outputMode("update")
.format("console").start();
但是由于20秒后有2次触发,我获得了两次输出
Trigger1:
textcol cnt
a 1
Trigger2:
textcol cnt
b 1
那么为什么窗口在20秒后不汇总结果和输出,而不是每次10-10秒触发一次?
还有其他方法可以在Spark结构化流媒体中实现它吗?
答案 0 :(得分:0)
将您的.outputMode("update")
更改为.outputMode("complete")