【问题标题】:In KSQL Stream <- Table left join, partial events are not joined properly在 KSQL Stream <- Table left join 中,部分事件未正确连接
【发布时间】:2019-10-17 06:41:59
【问题描述】:

我正在尝试使用 KSQL(5.2.3)&Kafka(2.12-2.3.0) 来丰富一些事件数据。

左连接流和表。

但是连接的部分结果并没有像我预期的那样包含丰富的数据。

我发现了问题。

问题是左连接是在表加载相关的先前事件之前处理的。

为了让问题更清楚,我粘贴了 Simplified KSQL Query and Event Data。

事件:

TimeStamp | EventType  | EventData
1         | Create     | ID:1, Name:"HELLO"
2         | Access     | ID:1, TID:2
3         | Write      | ID:1, TID:2
100       | Acesss     | ID:1, TID:3
110       | Write      | ID:1, TID:3

流&表:

CREATE STREAM SUBJECT_CREATE (TIMESTAMP='TimeStamp') AS SELECT TimeStamp, ID, Name FROM EVENT_STREAM WHERE EventType='Create' PARTITION BY ID;
CREATE TABLE SUBJECT_CREATE_TABLE (*) WITH (KAFKA_TOPIC='SUBJECT_CREATE', KEY='ID') ;

CREATE STREAM SUBJECT_ACCESS (TIMESTAMP='TimeStamp') AS SELECT TimeStamp, ID, TID FROM EVENT_STREAM WHERE EventType='Access' PARTITION BY ID;
CREATE STREAM SUBJECT_CR_AC_JOIN WITH(TIMESTAMP='TimeStamp') AS SELECT N.TimeStamp AS TimeStamp, N.ID AS ID, N.TID AS TID, P.Name AS Name FROM SUBJECT_ACCESS N LEFT JOIN SUBJECT_CREATE_TABLE P ON N.ID = P.ID PARTITION BY ID;

SUBJECT_CR_AC_JOIN 流的结果:

TimeStamp | ID | TID | Name
2         | 1  |  2  | null   ==> Expected "HELLO"
100       | 1  |  3  | "HELLO"

第二个包含“名称”,但第一个没有。

是否可以让它们在 KSQL 中同步?

谢谢。

【问题讨论】:

    标签: apache-kafka ksqldb


    【解决方案1】:

    ksqlDB 将尝试处理按其 ROWTIME 排序的数据。因此,如果您的流数据具有比表数据更早的时间戳,则它正确未加入表数据。毕竟,在流事件发生时,表数据并不存在。

    这是设计使然。

    您可以解决这个问题,您可以在流数据之前将表数据生成到 Kafka。在max.task.idle.ms 之后,如果没有流数据,ksqlDB 将开始处理表数据,这意味着将填充表。然后,您可以发送您的流数据。

    或者,您可以确保生成的流数据带有以后的时间戳到表数据。这将是最正确的解决方案。

    如果用于生成消息的时间戳错误,您还可以使用 WITH(TIMESTAMP='something') 从 Kafka 消息的有效负载中提取 ROWTIME。

    【讨论】:

      猜你喜欢
      • 2020-01-13
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多