KSQL Stream <- Table left join中,partial events没有正确join

In KSQL Stream <- Table left join, partial events are not joined properly

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

向左加入流 table。

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

我找到问题了。

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

为了弄清楚问题,我粘贴了简化的 KSQL 查询和事件数据。

事件:

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

流&Table:

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"

第二个包含 'Name',但第一个不包含。

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

谢谢。

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

这是设计使然。

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

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

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