apache-kafka - 为什么 Clickhouse 不支持向 kafka 表添加列
问题描述
我在 ClickHouse 中向 Kafka 队列添加列时遇到问题。
我用命令创建了一个表
CREATE TABLE my_db.my_queue ON CLUSTER my_cluster
(
`ts` String,
.... some other columns
)
ENGINE = Kafka()
SETTINGS
kafka_broker_list = '172.21.0.3:9092',
kafka_topic_list = 'my_topic',
kafka_group_name = 'my_group',
kafka_format = 'JSONEachRow',
kafka_row_delimiter = '\n',
kafka_num_consumers = 1,
kafka_skip_broken_messages = 10;
然后尝试添加一列
ALTER TABLE my_db.my_queue ON CLUSTER my_cluster ADD COLUMN new_column String;
但是出现错误
SQL Error [48]: ClickHouse exception, code: 48, host: 172.21.0.4, port: 8123; Code: 48,
e.displayText() = DB::Exception: There was an error on [clickhouse-server:9000]: Code: 48,
e.displayText() = DB::Exception: Alter of type 'ADD COLUMN' is not supported by storage Kafka
(version 20.11.4.13 (official build)) (version 20.11.4.13 (official build))
我不熟悉 ClickHouse 和任何分析数据库。所以我想知道为什么不支持它?或者我应该以另一种方式添加一列?
解决方案
支持来自 Kafka 队列的具有不同模式的消息的一种方法包括存储原始 JSON 消息,如下所示:
CREATE TABLE my_db.my_queue ON CLUSTER my_cluster
(
`message` String
)
ENGINE = Kafka()
SETTINGS
kafka_broker_list = '172.21.0.3:9092',
kafka_topic_list = 'my_topic',
kafka_group_name = 'my_group',
kafka_format = 'JSONAsString',
kafka_row_delimiter = '\n',
kafka_num_consumers = 1,
kafka_skip_broken_messages = 10;
JSONAsString格式将原始 JSON 存储在列message
中。通过这种方式,您可以从 Kafka 表中通过物化视图和JSON 函数对每个新行进行后处理。
例如:
CREATE TABLE my_db.post_processed_data (
`ts` String,
`another_column` String
)
-- use a proper engine
Engine=Log;
CREATE MATERIALIZED VIEW my_db.my_queue_mv TO my_db.post_processed_data
AS
SELECT
JSONExtractString(message, 'ts') AS ts,
JSONExtractString(message, 'another_column') AS another_column
FROM my_db.my_queue;
如果 Kafka 队列的 JSON 模式有任何变化,您可以相应ALTER TABLE .. ADD COLUMN ..
地在post_processed_data
表中执行操作并相应地更新物化视图。这样卡夫卡表将保持原样。
推荐阅读
- leaflet - 有没有更聪明的方法来组合标记和多边形
- postgresql - postgres-rust 错误 42601(常见语法错误):正确发布变量表名?
- java - Spring:初始化应用程序后如何启动逻辑
- visual-studio - 通过 2019 构建工具安装时未检测到 MSVC2015
- csv - SQL Server 将 CSV 数据导入临时表无法查询导入的数据
- laravel - 将 MongoDB 与 Laravel 连接时出错
- git - Fork GitHub 存储库供个人使用和贡献
- c++ - 计算在同一位置至少包含一个常见字符的不同字符串对
- javascript - 反应:让一个按钮在点击一个按钮时选择一些东西
- javascript - 在 NodeJs 中将 Uint8Array 转换为 Uint16Array