即使存在数据,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 |
有关详细信息,请参阅以下链接,
我正在学习 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 |
有关详细信息,请参阅以下链接,