KSQL-确定何时加载表

时间:2018-11-14 15:47:43

标签: apache-kafka ksql

如何确定KSQL何时将我的数据从Kafka主题完全加载到表中?

目标:参加2个Kafka主题,将它们加入,并将结果写入新的Kafka主题。

示例:

我正在使用Ksql的Rest API发出以下命令。

CREATE TABLE MyTable (A1 VARCHAR, A2 VARCHAR) WITH (kafka_topic='topicA', key='A1', value_format='json');
CREATE STREAM MyStream (B1 varchar, B2 varchar) WITH (kafka_topic='topicB', value_format='json');
CREATE STREAM MyDestination WITH (Kafka_topic='topicC', PARTITIONS = 1, value_format='json') AS SELECT a.A1 as A1, a.A2 as A2, b.B1 as B1, b.B2 as B2 FROM  MyStream b left join MyTable a on a.A1 = b.B1;

问题::topicC仅包含topicB中的数据,所有联接的值均为空。

尽管我从create table命令收到了SUCCESS的状态,但似乎数据还没有完全加载到表中。因此,第3条命令的结果仅包含来自流的数据,而不包含来自表的数据。如果我在执行join命令之前人为延迟,那么所得到的主题将正确地包含两个主题的数据。如何确定何时加载表以及执行连接命令是否安全?

2 个答案:

答案 0 :(得分:2)

这确实是一个很大的问题。此时,仅当表完全加载后,KSQL才能自动执行流表联接。这确实是一个有用的功能。这里讨论了一个更一般和相关的问题:https://github.com/confluentinc/ksql/issues/1751

答案 1 :(得分:0)

KSQL中的表(和基础的Kafka Streams)具有时间维度,即随着时间的发展。对于流表联接,每个流记录都使用“正确的”表版本进行联接(即,表按时间进行版本控制)。

在即将发布的CP 5.1中,可以通过确保表主题的所有记录时间戳小于流主题的记录时间戳来“预加载”表。这告诉KSQL,它需要首先处理表主题数据,但是要在开始连接之前相应地提高表的timestamp-version。

有关更多详细信息,请查看:https://www.confluent.io/resources/streams-tables-two-sides-same-coin