KSQL窗口聚合流

时间:2020-05-22 18:06:06

标签: apache-kafka ksqldb

我正在尝试使用KSQL Windowed Aggregation(特别是Session Window)按照事件的属性之一并随着时间的推移对事件进行分组。

我有一个用卡夫卡主题制作的STREAM,其TIMESTAMP属性指定得很好。

当我尝试创建带有会话窗口的STREAM时,查询如下:

CREATE STREAM SESSION_STREAM AS
SELECT ...
  FROM EVENT_STREAM
WINDOW SESSION (5 MINUTES)
   GROUP BY ...;

我总是会收到错误:

您的SELECT查询产生一个TABLE。请改用CREATE TABLE AS SELECT语句。

是否可以创建带有窗口聚合的STREAM


当我尝试按建议尝试创建一个TABLE然后创建一个STREAM时,其中包含所有会话开始事件,并带有如下查询:

CREATE STREAM SESSION_START_STREAM AS
SELECT *
  FROM SESSION_TABLE
 WHERE WINDOWSTART=WINDOWEND;

KSQL通知我:

KSQL不支持对窗口表进行持久查询

如何创建STREAM事件以启动KSQL中的会话窗口?

1 个答案:

答案 0 :(得分:3)

您的create stream语句(如果切换到create table语句)将创建一个不断更新的表。接收器主题SESSION_STREAM将包含对表的更改流,即其更改日志。

ksqlDB将其建模为TABLE,因为它具有TABLE语义,即,具有任何特定键的表中只能存在一行。但是,更改日志将包含已应用于表的更改的流。

如果您想要的是一个包含所有会话的主题,则类似这样的内容将创建该内容:

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

-- 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;

这将创建一个SESSIONS主题,其中包含对SESSIONS表的更改:即它的更改日志。

如果要将其转换为会话开始事件流,那么不幸的是,ksqlDB还没有 允许您直接从表中更改创建流,但是可以通过表的更改日志:

-- Create a stream over the existing `SESSIONS` topic.
-- Note it states the window_type is 'Session'.
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.10版本中,您将能够正确命名SESSION_STREAM中的键列:

CREATE STREAM SESSION_STREAM (USER_ID INT KEY, COUNT BIGINT) 
   WITH (kafka_topic='SESSIONS', value_format='JSON', window_type='Session');