在kafka中如何转换表中的主题?我需要复制远程表

时间:2018-10-11 14:03:49

标签: apache-kafka ksql

我确实配置了到数据库的连接,并且由于我运行使用者返回数据,因此通过该主题进行了所有数据传输

如何将本主题转换为表格并将数据持久保存在KSQL中?

非常感谢

1 个答案:

答案 0 :(得分:2)

您不会在KSQL中保留数据。 KSQL仅仅是在Kafka中查询和转换数据的引擎。 KSQL查询的源是Kafka主题,KSQL查询的输出是交互式的,或者是返回到另一个kafka主题。

如果您的Kafka主题中有数据(听起来很像),则在KSQL中运行LIST TOPICS;

ksql> LIST TOPICS;    

 Kafka Topic                 | Registered | Partitions | Partition Replicas | Consumers | ConsumerGroups
---------------------------------------------------------------------------------------------------------
 _confluent-metrics          | false      | 12         | 1                  | 0         | 0
 asgard.demo.accounts        | false      | 1          | 1                  | 0         | 0

查看您的Kafka主题。从那里选择您的主题,然后您可以运行PRINT 'my-topic' FROM BEGINNING;

ksql> PRINT 'asgard.demo.accounts' FROM BEGINNING;
Format:AVRO
10/11/18 9:24:45 AM UTC, null, {"account_id": "a42", "first_name": "Robin", "last_name": "Moffatt", "email": "robin@confluent.io", "phone": "+44 123 456 789", "address": "22 Acacia Avenue", "country": "United Kingdom", "create_ts": "2018-10-11T09:23:22Z", "update_ts": "2018-10-11T09:23:22Z", "messagetopic": "asgard.demo.accounts", "messagesource": "Debezium CDC from MySQL on asgard"}
10/11/18 9:24:45 AM UTC, null, {"account_id": "a081", "first_name": "Sidoney", "last_name": "Lafranconi", "email": "slafranconi0@cbc.ca", "phone": "+44 908 687 6649", "address": "40 Kensington Pass", "country": "United Kingdom", "create_ts": "2018-10-11T09:23:22Z", "update_ts": "2018-10-11T09:23:22Z", "messagetopic": "asgard.demo.accounts", "messagesource": "Debezium CDC from MySQL on asgard"}
10/11/18 9:24:45 AM UTC, null, {"account_id": "a135", "first_name": "Mick", "last_name": "Edinburgh", "email": "medinburgh1@eepurl.com", "phone": "+44 301 837 6535", "address": "27 Blackbird Lane", "country": "United Kingdom", "create_ts": "2018-10-11T09:23:22Z", "update_ts": "2018-10-11T09:23:22Z", "messagetopic": "asgard.demo.accounts", "messagesource": "Debezium CDC from MySQL on asgard"}

查看其内容。按Ctrl-C取消PRINT语句并返回命令行。

请注意Format语句输出中的PRINT。这是数据的序列化格式。

如果数据已在Avro中序列化,则可以运行:

CREATE STREAM mydata WITH (KAFKA_TOPIC='asgard.demo.accounts', VALUE_FORMAT='AVRO');

如果使用JSON,则还需要指定列名和数据类型

CREATE STREAM mydata (col1 INT, col2 VARCHAR) WITH (KAFKA_TOPIC='asgard.demo.accounts', VALUE_FORMAT='JSON');

现在您已经在KSQL中“注册”了该主题,您可以使用DESCRIBE查看其架构:

ksql> DESCRIBE mydata;

Name                 : MYDATA
 Field         | Type
-------------------------------------------
 ROWTIME       | BIGINT           (system)
 ROWKEY        | VARCHAR(STRING)  (system)
 ACCOUNT_ID    | VARCHAR(STRING)
 FIRST_NAME    | VARCHAR(STRING)
 LAST_NAME     | VARCHAR(STRING)
 EMAIL         | VARCHAR(STRING)
 PHONE         | VARCHAR(STRING)
 ADDRESS       | VARCHAR(STRING)
 COUNTRY       | VARCHAR(STRING)
 CREATE_TS     | VARCHAR(STRING)
 UPDATE_TS     | VARCHAR(STRING)
 MESSAGETOPIC  | VARCHAR(STRING)
 MESSAGESOURCE | VARCHAR(STRING)
-------------------------------------------

,然后使用KSQL查询和处理数据:

ksql> SET 'auto.offset.reset'='earliest';

ksql> SELECT FIRST_NAME + ' ' + LAST_NAME AS FULL_NAME, EMAIL FROM mydata WHERE COUNTRY='United Kingdom';

Robin Moffatt | robin@confluent.io
Sidoney Lafranconi | slafranconi0@cbc.ca
Mick Edinburgh | medinburgh1@eepurl.com
Merrill Stroobant | mstroobant2@china.com.cn

按Ctrl-C取消SELECT查询。

KSQL可以将其保留为一个新的Kafka主题:

CREATE STREAM UK_USERS AS SELECT FIRST_NAME + ' ' + LAST_NAME AS FULL_NAME, EMAIL FROM mydata WHERE COUNTRY='United Kingdom';

如果再次列出您的KSQL主题,您将看到创建并填充的新主题:

ksql> LIST TOPICS;

 Kafka Topic                 | Registered | Partitions | Partition Replicas | Consumers | ConsumerGroups
---------------------------------------------------------------------------------------------------------
 _confluent-metrics          | false      | 12         | 1                  | 0         | 0
 asgard.demo.accounts        | true       | 1          | 1                  | 2         | 2
 UK_USERS                    | true       | 4          | 1                  | 0         | 0
---------------------------------------------------------------------------------------------------------
ksql>

进入源主题(asgard.demo.accounts)的每个事件均由KSQL读取和过滤,并根据您执行的SQL写入目标主题(UK_USERS)。

有关更多信息,请参见KSQL syntax docstutorials

免责声明:我为开源KSQL项目背后的公司Confluent工作。