【问题标题】:How to force Clickhouse's Kafka engine to check Nested columns length如何强制 Clickhouse 的 Kafka 引擎检查嵌套列的长度
【发布时间】:2022-01-15 02:40:51
【问题描述】:

我有一个 Clickhouse 服务器,其中有一个带有嵌套字段和 kafka_handle_error_mode='stream',input_format_import_nested_json=1 设置的 Engine=Kafka 表和两个物化视图:

  • 一个用于_error='' 的情况,它将数据存储到与Engine=Kafka 表结构相同的底层表中
  • 一个用于_error!='',用于存储原始消息和错误,以防出现“错误”数据

问题是,当 clickhouse 从 kafka 获取具有不同嵌套列长度(例如 {"n":{"a":["1","2"], "b":["3"]}})的消息时,它会通过 Engine=Kafka 表而不生成 _error 并卡在表插入(并挂起整个保存循环),因为 Kafka 表不检查嵌套列的长度,但目标表会。

有一个flatten_nested=0 设置似乎改变了嵌套行为,但它需要不同的 json 结构,这对我来说是不可接受的。有解决办法吗?

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    我也很想知道是否有一种干净/高效的方法来解决它。

    可能适合您的用例的建议是将字符串存储在 Kafka 表中。 在物化视图中,可以使用 Json Functions 和过滤错误...

    CREATE TABLE kafka(
                payload String
                )  engine = Kafka
    SETTINGS  kafka_broker_list = 'localhost:9092',
        kafka_topic_list = 'nested',
        kafka_group_name = 'nested',
        kafka_format = 'JSONAsString',
        kafka_num_consumers = 1,
        kafka_handle_error_mode = 'stream';
    
    create materialized view  consumer
            to valid_payload_table
            as select
                   JSONExtract(payload, 'a', 'String') as a, 
                   JSONExtract(payload, 'b', 'String') as b,
            from kafka
            where _error!=''
    
    

    【讨论】:

    • 我认为 JSONAsString 解决方案不适合我的情况。如果目标表中有 Enum,则必须手动检查 where 子句中的 Enum 约束。除了需要检查数组大小。
    【解决方案2】:
    1. Kafka 引擎不会检查嵌套数组的大小,因为这是 MergeTree 表的限制。

    2. Kafka引擎的结构不一定要和MergeTree表匹配。只需在物化视图 SELECT 中添加相应的转换/检查即可。

    例子:

    create table n ( a Nested( n1 int, n2 int ) ) Engine=Kafka ....;
    create table m ( an1 Array(int), an2 Array(int) ) Engine = MergeTree order by tuple();
    
    create materialized view m_mv to m
    as select 
         a.n1 as an1, 
         a.n2 as an2
    from n;
    

    【讨论】:

    • 感觉应该有个设置可以启用检查
    • 物化视图中的自定义数组大小检查可以完成这项工作。我想知道它是否对插入性能有影响?
    • @YngveStardust 没有性能影响。在这种情况下,嵌套和数组之间的唯一区别是点“。”在名称中:“a.n1 Array(int)”与“an1 Array(int)”。
    • 这个检查的存在是一个哲学问题。大多数情况下,CH 会出于性能原因避免任何检查。我一直想知道为什么这个检查存在(在其他地方 CH 允许将垃圾保存在表中,为什么在这种情况下不存在)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 2019-07-12
    • 2023-03-25
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多