Вывод схемы JSON
ClickHouse может автоматически определить структуру данных JSON. Это может быть использовано для запроса данных JSON напрямую, например, на диске с clickhouse-local
или в ведрах S3, и/или для автоматического создания схем перед загрузкой данных в ClickHouse.
Когда использовать вывод типов
- Согласованная структура - Данные, из которых вы собираетесь вывести типы, содержат все колонки, которые вас интересуют. Данные с дополнительными колонками, добавленными после вывода типов, будут игнорироваться и не могут быть запрошены.
- Согласованные типы - Типы данных для конкретных колонок должны быть совместимы.
Если у вас есть более динамичный JSON, к которому добавляются новые ключи без достаточного предупреждения для изменения схемы, например, метки Kubernetes в логах, мы рекомендуем прочитать Проектирование схемы JSON.
Обнаружение типов
В наших предыдущих примерах использовалась простая версия набора данных Python PyPI в формате NDJSON. В этом разделе мы исследуем более сложный набор данных с вложенными структурами - набор данных arXiv, содержащий 2.5 миллиона научных статей. Каждая строка в этом наборе данных, распределенном в формате NDJSON, представляет собой опубликованную научную статью. Пример строки показан ниже:
Эти данные требуют гораздо более сложной схемы, чем предыдущие примеры. Мы описываем процесс определения этой схемы ниже, вводя сложные типы, такие как Tuple
и Array
.
Этот набор данных хранится в публичном ведре S3 по адресу s3://datasets-documentation/arxiv/arxiv.json.gz
.
Вы можете заметить, что указанный набор данных содержит вложенные объекты JSON. В то время как пользователи должны разрабатывать и версионировать свои схемы, вывод типов позволяет извлекать типы из данных. Это позволяет автоматически генерировать DDL схемы, избегая необходимости вручную ее строить и ускоряя процесс разработки.
Кроме определения схемы, вывод схемы JSON автоматически опознает формат данных по расширению файла и содержимому. Указанный файл автоматически определяется как NDJSON в результате.
Используя функцию s3 с командой DESCRIBE
, мы можем показать типы, которые будут выведены.
Вы можете заметить, что множество колонок определены как Nullable. Мы не рекомендуем использовать тип Nullable, когда это абсолютно не нужно. Вы можете использовать schema_inference_make_columns_nullable, чтобы контролировать поведение применения Nullable.
Мы видим, что большинство колонок были автоматически определены как String
, а колонка update_date
была правильно определена как Date
. Колонка versions
была создана как Array(Tuple(created String, version String))
, чтобы хранить список объектов, а authors_parsed
была определена как Array(Array(String))
для вложенных массивов.
Автоопределение дат и временных меток можно контролировать через параметры input_format_try_infer_dates
и input_format_try_infer_datetimes
соответственно (оба включены по умолчанию). Вывод объектов как кортежей контролируется параметром input_format_json_try_infer_named_tuples_from_objects
. Другие параметры, которые контролируют вывод схемы для JSON, такие как автоопределение чисел, можно найти здесь.
Запрос JSON
Мы можем полагаться на вывод схемы для запроса данных JSON на месте. Ниже мы находим лучших авторов за каждый год, используя тот факт, что даты и массивы автоматически распознаются.
Вывод схемы позволяет нам запрашивать JSON-файлы без необходимости указывать схему, ускоряя выполнение аналитических задач.
Создание таблиц
Мы можем полагаться на вывод схемы для создания схемы для таблицы. Следующая команда CREATE AS EMPTY
заставляет DDL для таблицы быть выведенным, и таблица будет создана. Это не загружает никаких данных:
Чтобы подтвердить схему таблицы, мы используем команду SHOW CREATE TABLE
:
Выше представлена правильная схема для этих данных. Вывод схемы основан на выборке данных и чтении данных построчно. Значения колонок извлекаются в соответствии с форматом, при этом используются рекурсивные парсеры и эвристики для определения типа каждого значения. Максимальное количество строк и байтов, читаемых из данных при выводе схемы, контролируется параметрами input_format_max_rows_to_read_for_schema_inference
(по умолчанию 25000) и input_format_max_bytes_to_read_for_schema_inference
(по умолчанию 32 МБ). В случае некорректного определения пользователи могут предоставить подсказки, как описано здесь.
Создание таблиц из фрагментов
Пример выше использует файл на S3 для создания схемы таблицы. Пользователи могут пожелать создать схему из однострочного фрагмента. Это можно сделать, используя функцию format, как показано ниже:
Загрузка данных JSON
Предыдущие команды создали таблицу, в которую данные могут быть загружены. Теперь вы можете вставить данные в вашу таблицу, используя следующий INSERT INTO SELECT
:
Для примеров загрузки данных из других источников, например, файла, смотрите здесь.
После загрузки мы можем запросить наши данные, при желании используя формат PrettyJSONEachRow
, чтобы показать строки в их исходной структуре:
Обработка ошибок
Иногда у вас могут быть плохие данные. Например, конкретные колонки, которые не имеют правильного типа или неправильно отформатированный JSON. Для этого вы можете использовать параметр input_format_allow_errors_ratio
, чтобы разрешить определенное количество строк игнорировать, если данные вызывают ошибки вставки. Дополнительно, подсказки могут быть предоставлены для помощи выводу.
Дополнительное чтение
Чтобы узнать больше о выводе типов данных, вы можете обратиться к этой документационной странице.