【问题标题】:Ksql: Left Join Displays columns from stream but not tablesKsql:左连接显示流中的列但不显示表
【发布时间】:2018-10-05 20:25:51
【问题描述】:

我在 KSQL 中有一个蒸汽和一个表,如下所述:

流名称:DEAL_STREAM

表名:EXPENSE_TABLE

当我运行以下查询时,它只显示流中的列,但不显示表列。

这是预期的输出。如果不是,我是不是做错了什么?

SELECT TD.EXPENSE_CODE, TD.BRANCH_CODE, TE.EXPENSE_DESC
FROM DEAL_STREAM TD
LEFT JOIN EXPENSE_TABLE TE ON TD.EXPENSE_CODE = TE.EXPENSE_CODE
WHERE TD.EXPENSE_CODE LIKE '%NL%' AND TD.BRANCH_CODE LIKE '%AM%';

查询的输出如下所示。

NL8232@#0          | AM   | null
NL0232@#0          | AM   | null
NL6232@!0          | AM   | null
NL5232^%0          | AM   | null

【问题讨论】:

标签: apache-kafka ksqldb


【解决方案1】:

当我运行以下查询时,它只显示流中的列,但不显示表列。

在流表(左)连接中,如果在连接/查找时表中没有匹配记录,则输出记录将包含 null 列(用于表侧列)。

这是预期的输出。如果不是,我是不是做错了什么?

是否有可能,例如,您在将 (2) 输入数据写入表之前将 (1) 输入数据写入流?如果是这样,那么流表连接查询将尝试在 (1) 的时间执行表查找,而表中还没有这样的查找数据可用(因为稍后在时间 (2) 发生了这种情况)。因为没有这样的表数据可用,连接写入了表侧列为null的输出记录。

注意:KSQL 中的这种流表连接(以及,通过扩展,构建 KSQL 的 Apache Kafka 的 Streams API)几乎是流世界中连接的规范。这里,只有流表连接的流端会触发下游连接输出,如果在连接新输入记录时,表端没有匹配的流记录,则表端列将是null。然而,由于这是用户混淆的常见原因,我们目前正在努力将连接输出的表端触发添加到 Apache Kafka 的 Streams API 和 KSQL。当这样的功能可用时,您上面的问题就不会再发生了。

【讨论】:

  • 在这种情况下。数据是在几周前使用 Oracle Golden Gate 从 Oracle DB 加载到 Kafka 的。现在,今天我从主题中的现有数据创建了流和表,并将偏移量设置为最早,以便它重播所有内容。当连接运行时,所有数据都存在于流和表中,所以理想情况下我应该得到匹配。我在这里有什么遗漏吗?
  • 我还有 2 个问题 1. 当新数据被添加到流中时,是否会完成表的完整扫描? 2. 我们可以在 4.1.0 中加入 2 个表,因为我几天前在 GitHub 上看到了一些讨论?这实现了吗?
  • 1) 是的,当新数据记录被添加到流中时,随后的连接(对于那些新记录)将查找相应的表数据(因为表数据现在可用)。 2) 4.1.0 尚不支持表-表连接,但很快就会加入。
  • Michael G. Noll - 我做了以下来彻底测试这个问题。 1. 清除我的数据管道中流的所有主题数据。 2.所有表仍然存在。 3. 从填充我的流的 OGG 运行初始加载。 4. 检查所有拼写错误等。 5. 将连接代码与现有表代码进行比较,以了解它们存在的描述。存在所有代码的事实描述。 6. 仍在填充代码的流中的数据,但未填充与代码对应的 desc 的表中的数据。请帮忙
  • 您好,我遇到了同样的问题,即 ktable 中存在数据,当我将其与流连接时,会打印流的列,但表的列显示空白列,请帮助!!
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 2019-08-17
  • 1970-01-01
  • 2019-01-04
  • 2013-03-02
相关资源
最近更新 更多