簡體   English   中英

KSQLDB - 從 debezium cdc 源連接器獲取數據並將流與表連接

[英]KSQLDB - Getting data from debezium cdc source connector and joining Stream with Table

伙計們。

先介紹一下場景:

我正在使用Debezium CDC Source ConnectorMS 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 CodeProvider' Subsidiary Code ,我認為這是另一個問題。

拜托,誰能幫我理解如何在KSQLDB解決這個KSQLDB

非常感謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM