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