使用物化视图将kafka数据导入到clickhouse

--------------------kafka通过物化视图导入clickhouse--------------
step1: 启动zk和kafka
step2:创建一个topic
./kafka-topics.sh --zookeeper localhost:2181 --create --topic test --replication-factor 3 --partitions 2

step3:创建一个生产者用于生产数据
./kafka-console-producer.sh --broker-list localhost:9092 --topic test

step4:创建一个消费之用于查看数据
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test         #不加--from-beginning 从最新的一条消息开始消费

step5:在clickhouse中创建一个物理表
create table kafka_table (
    id Int16,
    code String,
    name Nullable(String),
    insert_time DateTime DEFAULT now(),
    update_time Date  DEFAULT toDate(now())
    ) engine = MergeTree () order by id;

step6:在clickhouse中创建一个kafka引擎表
create table kafka_queue
(
 id   Int16,
 code String,
 name String
  ) engine = Kafka ()
  settings
  kafka_broker_list = '192.168.235.140:9092',
  kafka_topic_list = 'test',
  kafka_group_name = 'test_group',
  kafka_format = 'JSONEachRow',
  kafka_skip_broken_messages = 10;

step7:在clickhouse中创建一个物化视图
 create materialized view consumer TO kafka_table 
 as
 select id,code,name from kafka_queue;

step8:在生产中生产数据
{"id":12,"code":"12","name":null}
{"id":2,"code":"2","name":"2"}
{"id":3,"code":"3","name":""}
{"id":4,"code":null,"name":""}

--结论:在生产者发送数据后,当所有字段都非null时会写入ch,
当某个字段为null时,该条数据不能写入ch,即使在创建物理表时设定了Nullable,但不会导致程序异常,只是不能写入这条记录。
但是当创建物理表是设定了Nullable并且kafka引擎表在创建时也给定这个字段Nullable()时,此时这个字段为null值时,该条记录才会被成功写入,但是ch中该字段为null值。
当缺失某个字段,这条记录一样会被同步到ch,缺失的字段value为null,
当json消息多出一些字段,这条记录一样会被同步到ch,多余的字段会被忽略。
ch物理表中的字段如果有Nullable修饰,则kafka引擎表中对应的字段也需要有Nullable修饰。如果不一致会停止接受数据。

停止接收主题数据或更改转换逻辑,请 detach 物化视图:
 DETACH TABLE consumer;
修改完成后重新创建视图,可继续进行作业
create materialized view consumer TO kafka_table 
 as
 select id,code,name from kafka_queue;



ref:https://blog.csdn.net/ffb920724/article/details/113114629

 

posted @ 2021-02-23 23:53  cknds  阅读(1445)  评论(0编辑  收藏  举报