将 JSON 导入 ClickHouse
Import JSON into ClickHouse
我用这个语句创建 table:
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 对象中未出现在 table 描述中的字段?
目前无法跳过未知字段。
您可以创建带有附加字段的临时 table,将 INSERT
数据放入其中,然后将 INSERT
SELECT
放入最终 table。临时 table 可能有日志引擎和 INSERT
到 "staging" table 将比最终 MergeTree
table.
工作得更快
在代码中添加跳过未知字段的可能性相对容易(类似于设置 'format_skip_unknown_fields')。
最新的 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 中查看更多详细信息。
我用这个语句创建 table:
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 对象中未出现在 table 描述中的字段?
目前无法跳过未知字段。
您可以创建带有附加字段的临时 table,将 INSERT
数据放入其中,然后将 INSERT
SELECT
放入最终 table。临时 table 可能有日志引擎和 INSERT
到 "staging" table 将比最终 MergeTree
table.
在代码中添加跳过未知字段的可能性相对容易(类似于设置 'format_skip_unknown_fields')。
最新的 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 中查看更多详细信息。