为什么在每次触发后评估Spark结构化流式窗口聚合

时间:2018-07-18 17:05:25

标签: spark-structured-streaming

在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结构化流媒体中实现它吗?

1 个答案:

答案 0 :(得分:0)

将您的.outputMode("update")更改为.outputMode("complete")