--------------------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