Apache kafka KSQL KTabke+KTable连接双重结果异常

Apache kafka KSQL KTabke+KTable连接双重结果异常,apache-kafka,ksqldb,Apache Kafka,Ksqldb,我尝试内部连接ktable和ktable a和b表: 内部通过r键连接a和b表: create table ab_table as select * from a_table inner join b_table on a_table.r = b_table.r emit changes; 1用例。以慢速模式插入新数据 从ab_表中选择*发射更改-返回1行结果 rowtime: 5/23/20 4:44:06 PM UTC, key: 2, value: {"A_TABLE_ROWTIME":

我尝试内部连接ktable和ktable

a和b表:

内部通过r键连接a和b表:

create table ab_table as select * from a_table inner join b_table on a_table.r = b_table.r emit changes;
1用例。以慢速模式插入新数据

从ab_表中选择*发射更改-返回1行结果

rowtime: 5/23/20 4:44:06 PM UTC, key: 2, value: {"A_TABLE_ROWTIME":1590252246657,"A_TABLE_ROWKEY":"2","A_TABLE_R":"2","A_TABLE_TIME":"timeA","B_TABLE_ROWTIME":1590252246657,"B_TABLE_ROWKEY":"2","
B_TABLE_R":"2","B_TABLE_TIME":"timeB"}
rowtime: 5/23/20 4:44:06 PM UTC, key: 2, value: {"A_TABLE_ROWTIME":1590252246680,"A_TABLE_ROWKEY":"2","A_TABLE_R":"2","A_TABLE_TIME":"timeA","B_TABLE_ROWTIME":1590252246680,"B_TABLE_ROWKEY":"2","
B_TABLE_R":"2","B_TABLE_TIME":"timeB"}
从头开始打印AB_表-返回1行结果

rowtime: 5/23/20 4:44:06 PM UTC, key: 2, value: {"A_TABLE_ROWTIME":1590252246657,"A_TABLE_ROWKEY":"2","A_TABLE_R":"2","A_TABLE_TIME":"timeA","B_TABLE_ROWTIME":1590252246657,"B_TABLE_ROWKEY":"2","
B_TABLE_R":"2","B_TABLE_TIME":"timeB"}
rowtime: 5/23/20 4:44:06 PM UTC, key: 2, value: {"A_TABLE_ROWTIME":1590252246680,"A_TABLE_ROWKEY":"2","A_TABLE_R":"2","A_TABLE_TIME":"timeA","B_TABLE_ROWTIME":1590252246680,"B_TABLE_ROWKEY":"2","
B_TABLE_R":"2","B_TABLE_TIME":"timeB"}
2用例。以快速模式插入新数据

从ab_表中选择*发射更改-返回1行结果

rowtime: 5/23/20 4:44:06 PM UTC, key: 2, value: {"A_TABLE_ROWTIME":1590252246657,"A_TABLE_ROWKEY":"2","A_TABLE_R":"2","A_TABLE_TIME":"timeA","B_TABLE_ROWTIME":1590252246657,"B_TABLE_ROWKEY":"2","
B_TABLE_R":"2","B_TABLE_TIME":"timeB"}
rowtime: 5/23/20 4:44:06 PM UTC, key: 2, value: {"A_TABLE_ROWTIME":1590252246680,"A_TABLE_ROWKEY":"2","A_TABLE_R":"2","A_TABLE_TIME":"timeA","B_TABLE_ROWTIME":1590252246680,"B_TABLE_ROWKEY":"2","
B_TABLE_R":"2","B_TABLE_TIME":"timeB"}
从头开始打印AB_表-返回2行结果

rowtime: 5/23/20 4:44:06 PM UTC, key: 2, value: {"A_TABLE_ROWTIME":1590252246657,"A_TABLE_ROWKEY":"2","A_TABLE_R":"2","A_TABLE_TIME":"timeA","B_TABLE_ROWTIME":1590252246657,"B_TABLE_ROWKEY":"2","
B_TABLE_R":"2","B_TABLE_TIME":"timeB"}
rowtime: 5/23/20 4:44:06 PM UTC, key: 2, value: {"A_TABLE_ROWTIME":1590252246680,"A_TABLE_ROWKEY":"2","A_TABLE_R":"2","A_TABLE_TIME":"timeA","B_TABLE_ROWTIME":1590252246680,"B_TABLE_ROWKEY":"2","
B_TABLE_R":"2","B_TABLE_TIME":"timeB"}
什么是地狱?为什么在第二个用例中,我在主题中有两行重复

更新关于主题\表的信息


弄清楚这里发生了什么。这与缓冲有关

默认情况下,ksqlDB缓冲来自两个源表变更日志的输入,即主题a和b。这种缓冲有助于将报告同一密钥更改的所有多条消息压缩到单个输出中

当一次触发两个表的更新时,缓冲意味着在刷新缓冲时填充两个表。由于表联接的两侧都会产生一个输出,所以两个输入事件都会相互匹配,从而产生两个到主题AB_表的输出

PRINT AB_表正确显示了变更日志中的两行

但是,SELECT*FROM AB_表发出的更改也会缓冲输入,并且该缓冲会将两个更改压缩为单个输出

缓冲可以通过控制。例如,您可以通过以下方式关闭缓冲:

-- turn off buffering:
SET 'cache.max.bytes.buffering' = 0;
在运行上述内容之后,我再次运行了您的示例,在AB_表主题中只有一行


有人可能会争辩说,不管使用何种缓冲,表联接的正确输出都只是一行。毕竟,处理的第一行不应该找到匹配项,第二行应该找到匹配项。如果您对此感觉强烈,那么请在Github中提出一个bug。

要了解发生了什么,了解两个源表/主题中的内容会有所帮助。此外,您正在使用“从开始打印x”,它将从主题的开始打印,即包括历史行,并使用“选择*表格x发出更改”,它将只发出新行,即没有历史行。我添加了有关主题\表的信息。我做了两个相等的例子,在快速的例子中,我得到了主题中的两行。没有准备日期和历史。任何人都可以重复:向上清除群集,无数据,无历史记录,无任何内容,在向上清除群集后应用案例1,无数据,无历史记录,无任何内容,并应用案例2。您将看到不同的结果Hey Padavan,我所关注的是运行案例2后两个源主题的内容。i、 e.从一开始打印a和从一开始打印b的输出是什么?@AndrewCoates从一开始就添加了打印a;从头开始打印b;对于插入datawow thx@AndrewCoates后的第二个用例。我试着在8小时内解决这个问题。。。这是惊人的一个代码做不同的结果。。。它的臭虫!我是前一天开始学英语的,如果你愿意的话,在github中创建一个关键bug。@RobinMoffatt也可以看到。我知道您在Confluent工作。现有的Jira涵盖了根本原因:但是,请注意,如果变更日志被具体化,那么结果将是正确的。
-- turn off buffering:
SET 'cache.max.bytes.buffering' = 0;