KSQL跳频窗口:仅访问最旧的子窗口

时间:2018-08-10 22:10:21

标签: apache-kafka streaming ksql

我正在使用看起来像这样的查询来跟踪特定字段的滚动总和:

SELECT id, SUM(quantity) AS quantity from stream \
WINDOW HOPPING (SIZE 1 MINUTE, ADVANCE BY 10 SECONDS) \
GROUP BY id;

现在,对于每个输入滴答声,似乎都向我返回了以下时间段内的6个不同的汇总值:

[start, start+60] seconds
[start+10, start+60] seconds
[start+20, start+60] seconds
[start+30, start+60] seconds
[start+40, start+60] seconds
[start+50, start+60] seconds

如果我感兴趣的话,每次进入的每个滴答声都只会获得[start,start + 60]秒的结果。总之,只有那样吗?

2 个答案:

答案 0 :(得分:1)

由于指定了一个跳窗,因此每个记录都属于多个窗口,并且在处理记录时需要更新所有窗口。仅更新一个窗口将是不正确的,并且结果将是错误的。

比较有关跳窗的Kafka Streams文档(Kafka Streams是KSQL的内部运行时引擎):https://docs.confluent.io/current/streams/developer-guide/dsl-api.html#hopping-time-windows

答案 1 :(得分:0)

我遇到了类似的情况,并创建了一个用户定义的函数以使用collect_list(column)仅访问窗口。size()=窗口持续时间似乎是一个有希望的轨道。

在udf中,使用“列表”类型获取汇总基列值列表之一。然后评估形成的列表大小等于周期的跳跃窗口数,否则返回null。

由此创建一个表,用于选择数据并使用udf对其进行转换。

从此最新表创建一个表,并在转换后的列上过滤出空值。