[英]KSQLDB - Getting data from debezium cdc source connector and joining Stream with Table
伙計們。
先介紹一下場景:
我正在使用Debezium CDC Source Connector
從MS SQL SERVER
中的兩個表中獲取數據。 遵循連接器配置:
PROVIDER 表的連接器:
CREATE SOURCE CONNECTOR SOURCE_MSSQL_01_PROVIDER WITH (
'connector.class'= 'io.debezium.connector.sqlserver.SqlServerConnector',
'database.hostname'= '<URL>',
'database.port'= '1433',
'database.user'= '<USER>',
'database.password'= '<PASS>',
'database.dbname'= 'a',
'database.server.name'= 'a',
'table.whitelist'='dbo.PROVIDER',
'decimal.handling.mode'='double',
'transforms'= 'unwrap,addTopicPrefix',
'transforms.unwrap.type'= 'io.debezium.transforms.ExtractNewRecordState',
'transforms.addTopicPrefix.type'='org.apache.kafka.connect.transforms.RegexRouter',
'transforms.addTopicPrefix.regex'='(.*)',
'transforms.addTopicPrefix.replacement'='mssql-01-$1',
'database.history.kafka.bootstrap.servers'= 'kafka:29092',
'database.history.kafka.topic'= 'dbhistory.PROVIDER'
);
ORDERS 表的連接器:
CREATE SOURCE CONNECTOR SOURCE_MSSQL_01_ORDER WITH (
'connector.class'= 'io.debezium.connector.sqlserver.SqlServerConnector',
'database.hostname'= '<URL>',
'database.port'= '1433',
'database.user'= '<USER>',
'database.password'= '<PASS>',
'database.dbname'= 'a',
'database.server.name'= 'a',
'table.whitelist'='dbo.ORDER',
'decimal.handling.mode'='double',
'transforms'= 'unwrap,addTopicPrefix',
'transforms.unwrap.type'= 'io.debezium.transforms.ExtractNewRecordState',
'transforms.addTopicPrefix.type'='org.apache.kafka.connect.transforms.RegexRouter',
'transforms.addTopicPrefix.regex'='(.*)',
'transforms.addTopicPrefix.replacement'='mssql-01-$1',
'database.history.kafka.bootstrap.servers'= 'kafka:29092',
'database.history.kafka.topic'= 'dbhistory.ORDER'
);
我認為它可以改進,但現在還好。
一旦設置了連接器,我們就可以創建我們的流和表:
CREATE TABLE PROVIDER (ID_P VARCHAR PRIMARY KEY) WITH (KAFKA_TOPIC='mssql-01-a.dbo.PROVIDER', VALUE_FORMAT='AVRO');
CREATE STREAM ORDERS WITH (KAFKA_TOPIC='mssql-01 a.dbo.ORDERS',VALUE_FORMAT='AVRO');
如您所見,現在它只是使用 PROVIDER 表中的數據豐富 ORDERS 流,對嗎? 是的,但不是。
SELECT P.PROVIDER_COD, O.ID FROM ORDERS AS O JOIN PROVIDER AS P ON O.PROV = P.PROVIDER_COD EMIT CHANGES;
如果我嘗試這樣做,我會收到一個錯誤:
無法對 TABLE 源重新分區。 如果這是連接,請確保條件使用 TABLE 的鍵列 ID_P 而不是 [PROVIDER_COD]
嗯,它應該很容易修復,但在這種情況下不是。 最后我們解決了我的問題:
Provider's id
不在ORDERS stream
,因為這就是我從中獲取數據的數據庫的設計方式。
我們如何將這兩個數據集聯系起來?
如果它是一個關系數據庫,那就很容易了:
SELECT * FROM ORDERS O INNER JOIN PROVIDER P ON O.PROV = P.PROVIDER_COD AND O.SUB_COD = P.SUB_COD;
是的......我之前沒有提到它,但我們這里有一個復合鍵, Provider Code
和Provider' Subsidiary Code
,我認為這是另一個問題。
拜托,誰能幫我理解如何在KSQLDB
解決這個KSQLDB
?
非常感謝。
我在 Confluent 論壇上找到了解決方案。
感謝 Matthias J. Sax
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.