即使存在数据,KSQL 左联接也会给出 'null' 结果

KSQL left join giving 'null' result even when data is present

我正在学习 K-SQL/KSQL-DB 并且目前正在探索联接。以下是我卡住​​的问题。

我有 1 个流 'DRIVERSTREAMREPARTITIONEDKEYED' 和一个 table 'COUNTRIES',下面是它们的描述。

ksql> describe DRIVERSTREAMREPARTITIONEDKEYED;
Name: DRIVERSTREAMREPARTITIONEDKEYED
 Field       | Type
--------------------------------------
 COUNTRYCODE | VARCHAR(STRING)  (key)
 NAME        | VARCHAR(STRING)
 RATING      | DOUBLE
--------------------------------------

ksql> describe countries;

Name                 : COUNTRIES
 Field       | Type
----------------------------------------------
 COUNTRYCODE | VARCHAR(STRING)  (primary key)
 COUNTRYNAME | VARCHAR(STRING)
----------------------------------------------

这是他们的样本数据,

ksql> select * from DRIVERSTREAMREPARTITIONEDKEYED emit changes;
+---------------------------------------------+---------------------------------------------+---------------------------------------------+
|COUNTRYCODE                                  |NAME                                         |RATING                                       |
+---------------------------------------------+---------------------------------------------+---------------------------------------------+
|SGP                                          |Suresh                                       |3.5                                          |
|IND                                          |Mahesh                                       |2.4                                          |

ksql> select * from countries emit changes;
+---------------------------------------------------------------------+---------------------------------------------------------------------+
|COUNTRYCODE                                                          |COUNTRYNAME                                                          |
+---------------------------------------------------------------------+---------------------------------------------------------------------+
|IND                                                                  |INDIA                                                                |
|SGP                                                                  |SINGAPORE                                                            |

我正在尝试对它们进行 'left outer' 连接,流在左侧,但下面是我得到的输出,

select d.name,d.rating,c.COUNTRYNAME from DRIVERSTREAMREPARTITIONEDKEYED d left join countries c on d.COUNTRYCODE=c.COUNTRYCODE emit changes;
+---------------------------------------------+---------------------------------------------+---------------------------------------------+
|NAME                                         |RATING                                       |COUNTRYNAME                                  |
+---------------------------------------------+---------------------------------------------+---------------------------------------------+
|Suresh                                       |3.5                                          |null                                         |
|Mahesh                                       |2.4                                          |null                                         |

在理想情况下,我应该在 'COUNTRYNAME' 列中获取数据,因为流和数据中的 'COUNTRYCODE' 列都具有匹配数据。

我尝试了很多搜索但无济于事。 我正在使用 'Confluent Platform: 6.1.1'

为了使连接正常工作,我们有责任验证正在连接的两个实体的键是否位于同一分区中,KsqlDB 无法验证两个连接输入的分区策略是否相同。

在我的例子中,我的 'Drivers' 主题有 2 个分区,我在这些分区上创建了一个流 'DriversStream',这反过来也有 2 个分区,但是 table 'Countries'我想加入它只有 1 个分区,因此我 're-keyed' 'DriversStream' 并创建了问题中显示的另一个流 'DRIVERSTREAMREPARTITIONEDKEYED'。

但是 table 的数据和流不在同一个分区中,因此连接失败。

我创建了另一个包含 1 个分区的主题 'DRIVERINFO'。

 kafka-topics --bootstrap-server localhost:9092 --create --partitions 1 --replication-factor 1 --topic DRIVERINFO

然后在上面创建了一个流 'DRIVERINFOSTREAM'。

 CREATE STREAM DRIVERINFOSTREAM (NAME STRING, RATING DOUBLE, COUNTRYCODE STRING) WITH (KAFKA_TOPIC='DRIVERINFO', VALUE_FORMAT='JSON');

终于加入了 'COUNTRIES' table 终于成功了。

ksql> select d.name,d.rating,c.COUNTRYNAME from DRIVERINFOSTREAM d left join countries c on d.COUNTRYCODE=c.COUNTRYCODE EMIT CHANGES;
+-------------------------------------------+-------------------------------------------+-------------------------------------------+
|NAME                                       |RATING                                     |COUNTRYNAME                                |
+-------------------------------------------+-------------------------------------------+-------------------------------------------+
|Suresh                                     |2.4                                        |SINGAPORE                                  |
|Mahesh                                     |3.6                                        |INDIA                                      |


有关详细信息,请参阅以下链接,

KSQL join

Partitioning data for Joins