2016-09-08 821 views
4

创建表的语句:导入JSON到ClickHouse

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对象中没有出现在表格描述中的字段?

回答

8

最新的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更多细节。

+1

有更方便的方式指定clickhouse客户端的设置: clickhouse-client --input_format_skip_unknown_fields = 1 --query =“INSERT INTO event FORMAT JSONEachRow;” – uYSIZfoz

1

目前,不可能跳过未知字段。

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

增加将未知字段跳转到代码中的可能性比较容易(例如设置'format_skip_unknown_fields')。