Вопрос:
Я создаю таблицу с этим выражением:
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 throw:
Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: location: (at row 1)
Можно ли пропускать поля из объекта JSON, которые не представлены в описании таблицы?
Лучший ответ:
Последняя версия ClickHouse (v1.1.54023) поддерживает пользовательский параметр input_format_skip_unknown_fields, который позволяет пропускать неизвестные поля для форматов JSONEachRow и TSKV.
Try
clickhouse-client -n —query=»SET input_format_skip_unknown_fields=1; INSERT INTO event FORMAT JSONEachRow;»
Подробнее в документации.
Ответ №1
В настоящее время невозможно пропустить неизвестные поля.
Вы можете создать временную таблицу с дополнительным полем, данными INSERT и затем сделать INSERT SELECT в финальной таблице. Временная таблица может иметь механизм регистрации и INSERT, чтобы эта “промежуточная” таблица работала быстрее, чем в итоговой таблице MergeTree.
Относительно легко добавить возможность пропустить неизвестные поля в коде (что-то вроде установки ‘format_skip_unknown_fields’).