在KSQL Stream <-表左连接中,部分事件未正确连接

时间:2019-10-17 06:41:59

标签: apache-kafka ksql

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

将流与表左连接。

但是联接的部分结果不包含我期望的丰富数据。

我发现了问题。

问题在于,左联接在表加载相关的先前事件之前已处理。

为弄清楚问题,我粘贴了简化的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

流和表:

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中同步?

谢谢。

1 个答案:

答案 0 :(得分:0)

ksqlDB将尝试处理其ROWTIME排序的数据。因此,如果您的流数据的时间戳早于表数据,则正确不会被加入表数据。毕竟,流事件发生时表数据不存在。

这是设计使然。

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

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

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