8

我用这个语句创建表:

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 对象中未在表描述中显示的字段?

4

2 回答 2

17

最新的 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;"

在文档中查看更多详细信息。

于 2016-10-12T10:27:24.473 回答
1

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

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

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

于 2016-09-16T01:28:44.143 回答