【问题标题】:Import JSON into ClickHouse将 JSON 导入 ClickHouse
【发布时间】:2026-02-05 16:10:01
【问题描述】:

我用这个语句创建表:

CREATE TABLE event(
    date Date,
    src UInt8,
    channel UInt8,
    deviceTypeId UInt8,
    projectId UInt64,
    shows UInt32,
    clicks UInt32,
    spent Float64
) ENGINE = MergeTree(date, (date, src, channel, projectId), 8192);

原始数据如下所示:

{ "date":"2016-03-07T10:00:00+0300","src":2,"channel":18,"deviceTypeId ":101, "projectId":2363610,"shows":1232,"clicks":7,"spent":34.72,"location":"Unknown", ...}
...

使用以下命令加载数据的文件:

cat *.data|sed 's/T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]+0300//'| clickhouse-client --query="INSERT INTO event FORMAT JSONEachRow"

clickhouse-client 抛出异常:

Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: location: (at row 1)

是否可以跳过 JSON 对象中未在表描述中显示的字段?

【问题讨论】:

    标签: database clickhouse


    【解决方案1】:

    目前,无法跳过未知字段。

    您可以创建带有附加字段的临时表,将INSERT 数据放入其中,然后将INSERT SELECT 放入最终表中。临时表可能有日志引擎,INSERT 进入该“临时”表将比进入最终 MergeTree 表更快。

    在代码中添加跳过未知字段的可能性相对容易(例如设置“format_skip_unknown_fields”)。

    【讨论】:

      【解决方案2】:

      最新的 ClickHouse 版本 (v1.1.54023) 支持 input_format_skip_unknown_fields 用户选项,可以跳过 JSONEachRow 和 TSKV 格式的未知字段。

      试试

      clickhouse-client -n --query="SET input_format_skip_unknown_fields=1; INSERT INTO event FORMAT JSONEachRow;"
      

      documentation查看更多详情。

      【讨论】:

      • 在clickhouse-client中指定设置有更方便的方法:clickhouse-client --input_format_skip_unknown_fields=1 --query="INSERT INTO event FORMAT JSONEachRow;"