KSQL窗口聚合流,会话结束

时间:2020-05-25 14:18:49

标签: apache-kafka ksqldb

我正在使用KSQL Windowed Aggregation(特别是Session Window)将来自kafka主题的事件按照其属性之一进行分类,并随着时间的流逝进行分组。

我已经能够创建this answer中所述的“会话开始信号”流。

-- create a stream with a new 'data' topic:
CREATE STREAM DATA (USER_ID INT) 
    WITH (kafka_topic='data', value_format='json', partitions=2);

-- create a table that tracks user interactions per session:
CREATE TABLE SESSION AS
SELECT USER_ID, COUNT(USER_ID) AS COUNT
  FROM DATA
WINDOW SESSION (5 SECONDS)
   GROUP BY USER_ID;

-- Create a stream over the existing `SESSIONS` topic.
CREATE STREAM SESSION_STREAM (ROWKEY INT KEY, COUNT BIGINT) 
   WITH (kafka_topic='SESSIONS', value_format='JSON', window_type='Session');

-- Create a stream of window start events:
CREATE STREAM SESSION_STARTS AS 
    SELECT * FROM SESSION_STREAM 
    WHERE WINDOWSTART = WINDOWEND;

是否可以在每次窗口聚合结束时创建“会话结束信号”流?

1 个答案:

答案 0 :(得分:0)

我假设您的意思是您想在会话窗口没有看到适合您为该窗口配置的5 seconds的会话的任何新消息时发出事件/行吗?

我认为目前不可能。

因为源数据可能具有乱序的记录,即时间戳比已处理的行早得多的事件,所以一旦5 SECONDS窗口结束后,就无法“关闭”会话窗口

默认情况下,如果未收到应包含在会话中的新数据,则默认情况下,现有会话将在24小时后关闭。可以通过在窗口定义中设置GRACE PERIOD来控制。

宽限期过去后,此关闭窗口不会导致当前输出任何行。但是,KLIP 10 - Add Suppress to KSQL实施后可能会给您带来希望