我正在使用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;
是否可以在每次窗口聚合结束时创建“会话结束信号”流?
答案 0 :(得分:0)
我假设您的意思是您想在会话窗口没有看到适合您为该窗口配置的5 seconds
的会话的任何新消息时发出事件/行吗?
我认为目前不可能。
因为源数据可能具有乱序的记录,即时间戳比已处理的行早得多的事件,所以一旦5 SECONDS
窗口结束后,就无法“关闭”会话窗口
默认情况下,如果未收到应包含在会话中的新数据,则默认情况下,现有会话将在24小时后关闭。可以通过在窗口定义中设置GRACE PERIOD
来控制。
宽限期过去后,此关闭窗口不会导致当前输出任何行。但是,KLIP 10 - Add Suppress to KSQL实施后可能会给您带来希望