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 に答える