Перейти к основному содержимому
Перейти к основному содержимому

schema-inference

description: 'Страница, описывающая автоматическое определение схемы из входных данных в ClickHouse' sidebar_label: 'Вывод схемы' slug: /interfaces/schema-inference title: 'Автоматическое определение схемы из входных данных'

ClickHouse может прочитать эти данные, не указывая их структуру:

Примечание: формат JSONEachRow был автоматически определен по расширению файла .jsonl.

Вы можете увидеть автоматически определенную структуру, используя запрос DESCRIBE:

Движки таблиц File, S3, URL, HDFS, azureBlobStorage

Если список столбцов не указан в запросе CREATE TABLE, структура таблицы будет определена автоматически на основе данных.

Пример:

Давайте используем файл hobbies.jsonl. Мы можем создать таблицу с движком File с данными из этого файла:

clickhouse-local

clickhouse-local имеет необязательный параметр -S/--structure со структурой входных данных. Если этот параметр не указан или установлен в auto, структура будет определена на основе данных.

Пример:

Давайте используем файл hobbies.jsonl. Мы можем выполнить запрос к данным из этого файла, используя clickhouse-local:

Использование структуры из таблицы вставки

Когда табличные функции file/s3/url/hdfs используются для вставки данных в таблицу, есть возможность использовать структуру из таблицы вставки вместо извлечения ее из данных. Это может улучшить производительность вставки, поскольку вывод схемы может занять некоторое время. Также это будет полезно, когда у таблицы есть оптимизированная схема, чтобы не выполнять преобразования между типами.

Существует специальная настройка use_structure_from_insertion_table_in_table_functions, которая контролирует это поведение. У ее есть 3 возможных значения:

  • 0 - табличная функция извлечет структуру из данных.
  • 1 - табличная функция использует структуру из таблицы вставки.
  • 2 - ClickHouse автоматически определит, возможно ли использовать структуру из таблицы вставки или использовать вывод схемы. Значение по умолчанию.

Пример 1:

Давайте создадим таблицу hobbies1 со следующей структурой:

И вставим данные из файла hobbies.jsonl:

В этом случае все столбцы из файла вставляются в таблицу без изменений, поэтому ClickHouse будет использовать структуру из таблицы вставки вместо вывода схемы.

Пример 2:

Давайте создадим таблицу hobbies2 со следующей структурой:

И вставим данные из файла hobbies.jsonl:

В этом случае все столбцы в запросе SELECT присутствуют в таблице, поэтому ClickHouse будет использовать структуру из таблицы вставки. Обратите внимание, что это будет работать только для форматов ввода, которые поддерживают чтение подмножества столбцов, такие как JSONEachRow, TSKV, Parquet и т.д. (поэтому это не будет работать, например, для формата TSV).

Пример 3:

Давайте создадим таблицу hobbies3 со следующей структурой:

И вставим данные из файла hobbies.jsonl:

В этом случае столбец id используется в запросе SELECT, но в таблице нет этого столбца (в ней есть столбец с именем identifier), поэтому ClickHouse не может использовать структуру из таблицы вставки, и будет использоваться вывод схемы.

Пример 4:

Давайте создадим таблицу hobbies4 со следующей структурой:

И вставим данные из файла hobbies.jsonl:

В этом случае выполняются некоторые операции с столбцом hobbies в запросе SELECT для вставки его в таблицу, поэтому ClickHouse не может использовать структуру из таблицы вставки, и будет использоваться вывод схемы.

Кэш вывода схемы

Для большинства форматов ввода вывод схемы читает некоторые данные, чтобы определить его структуру, и этот процесс может занять некоторое время. Чтобы предотвратить определение одной и той же схемы каждый раз, когда ClickHouse читает данные из одного и того же файла, определенная схема кэшируется, и, при следующем доступе к тому же файлу, ClickHouse будет использовать схему из кэша.

Существуют специальные настройки, которые контролируют этот кэш:

  • schema_inference_cache_max_elements_for_{file/s3/hdfs/url/azure} - максимальное количество кэшированных схем для соответствующей табличной функции. Значение по умолчанию - 4096. Эти настройки должны быть установлены в конфигурации сервера.
  • schema_inference_use_cache_for_{file,s3,hdfs,url,azure} - позволяет включать/выключать использование кэша для вывода схемы. Эти настройки могут использоваться в запросах.

Схема файла может быть изменена путем изменения данных или изменения настроек формата. По этой причине кэш вывода схемы идентифицирует схему по источнику файла, имени формата, использованным настройкам формата и времени последнего изменения файла.

Примечание: некоторые файлы, доступные по URL в табличной функции url, могут не содержать информации о времени последнего изменения; в этом случае есть специальная настройка schema_inference_cache_require_modification_time_for_url. Отключение этой настройки позволяет использовать схему из кэша без времени последнего изменения для таких файлов.

Существует также системная таблица schema_inference_cache со всеми текущими схемами в кэше и системный запрос SYSTEM DROP SCHEMA CACHE [FOR File/S3/URL/HDFS], который позволяет очистить кэш схем для всех источников или для конкретного источника.

Примеры:

Давайте попробуем определить структуру выборки из набора данных s3 github-2022.ndjson.gz и посмотрим, как работает кэш вывода схемы:

Как вы видите, второй запрос завершился почти мгновенно.

Давайте попробуем изменить некоторые настройки, которые могут повлиять на вывод схемы:

Как вы видите, схема из кэша не была использована для того же файла, потому что изменение одной из настроек, которые могут повлиять на вывод схемы, произошло.

Давайте проверим содержимое таблицы system.schema_inference_cache:

Как вы видите, для одного и того же файла существует две разные схемы.

Мы можем очистить кэш схем, используя системный запрос:

Текстовые форматы

Для текстовых форматов ClickHouse читает данные построчно, извлекает значения столбцов в соответствии с форматом, а затем использует некоторые рекурсивные парсеры и эвристики для определения типа для каждого значения. Максимальное количество строк и байт, читаемых из данных для вывода схемы, контролируется настройками input_format_max_rows_to_read_for_schema_inference (по умолчанию 25000) и input_format_max_bytes_to_read_for_schema_inference (по умолчанию 32Mb). По умолчанию все определенные типы являются Nullable, но вы можете изменить это, установив schema_inference_make_columns_nullable (см. примеры в разделе настройки).

Форматы JSON

В форматах JSON ClickHouse разбирает значения в соответствии со спецификацией JSON и затем пытается найти наиболее подходящий тип данных для них.

Давайте посмотрим, как это работает, какие типы могут быть определены и какие конкретные настройки могут быть использованы в форматах JSON.

Примеры

Здесь и далее в примерах будет использоваться табличная функция format.

Целые числа, числа с плавающей запятой, булевы значения, строки:

Даты, Даты и времена:

Массивы:

Если массив содержит null, ClickHouse будет использовать типы из других элементов массива:

Именованные кортежи:

При включении настройки input_format_json_try_infer_named_tuples_from_objects ClickHouse во время вывода схемы попытается вывести именованный кортеж из JSON объектов. Результирующий именованный кортеж будет содержать все элементы из всех соответствующих JSON объектов из выборки данных.

Безымянные кортежи:

В форматах JSON мы рассматриваем массивы с элементами разных типов как безымянные кортежи.

Если некоторые значения равны null или пусты, мы используем типы соответствующих значений из других строк:

Карты:

В JSON мы можем прочитать объекты с одинаковыми типами значений как тип Map. Обратите внимание: это будет работать только при отключенных настройках input_format_json_read_objects_as_strings и input_format_json_try_infer_named_tuples_from_objects.

Тип JSON объекта (если настройка allow_experimental_object_type включена):

Вложенные сложные типы:

Если ClickHouse не может определить тип для какого-либо ключа, поскольку данные содержат только null или пустые объекты/пустые массивы, будет использоваться тип String, если настройка input_format_json_infer_incomplete_types_as_strings включена, или в противном случае будет выброшено исключение:

Настройки JSON

input_format_json_try_infer_numbers_from_strings

Включение этой настройки позволяет выводить числа из строковых значений.

Эта настройка по умолчанию отключена.

Пример:

input_format_json_try_infer_named_tuples_from_objects

Включение этой настройки позволяет выводить именованные кортежи из JSON объектов. Результирующий именованный кортеж будет содержать все элементы из всех соответствующих JSON объектов из выборки данных. Это может быть полезно, когда данные JSON не разрежены, чтобы выборка данных содержала все возможные ключи объекта.

Эта настройка включена по умолчанию.

Пример

Результат:

Результат:

input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects

Включение этой настройки позволяет использовать тип String для неоднозначных путей во время вывода именованных кортежей из JSON объектов (когда включен input_format_json_try_infer_named_tuples_from_objects) вместо исключения. Это позволяет читать JSON объекты в качестве именованных кортежей, даже если существуют неоднозначные пути.

По умолчанию отключено.

Примеры

С отключенной настройкой:

Результат:

С включенной настройкой:

Результат:

input_format_json_read_objects_as_strings

Включение этой настройки позволяет читать вложенные JSON объекты как строки. Эта настройка может использоваться для чтения вложенных JSON объектов без использования типа JSON объекта.

Эта настройка включена по умолчанию.

Примечание: включение этой настройки будет иметь эффект только если настройка input_format_json_try_infer_named_tuples_from_objects отключена.

input_format_json_read_numbers_as_strings

Включение этой настройки позволяет читать числовые значения как строки.

Эта настройка включена по умолчанию.

Пример

input_format_json_read_bools_as_numbers

Включение этой настройки позволяет читать Bool значения как числа.

Эта настройка включена по умолчанию.

Пример:

input_format_json_read_bools_as_strings

Включение этой настройки позволяет читать Bool значения как строки.

Эта настройка включена по умолчанию.

Пример:

input_format_json_read_arrays_as_strings

Включение этой настройки позволяет читать значения JSON массива как строки.

Эта настройка включена по умолчанию.

Пример

input_format_json_infer_incomplete_types_as_strings

Включение этой настройки позволяет использовать тип String для JSON ключей, которые содержат только Null/{}/[] в выборке данных во время вывода схемы. В JSON форматах любое значение может быть прочитано как String, если все соответствующие настройки включены (они все включены по умолчанию), и мы можем избежать ошибок, таких как Невозможно определить тип для столбца 'column_name' по первым 25000 строкам данных, скорее всего, этот столбец содержит только Null или пустые Массивы/Карты, во время вывода схемы используя тип String для ключей с неизвестными типами.

Пример:

Результат:

CSV

В формате CSV ClickHouse извлекает значения столбцов из строки в соответствии с разделителями. ClickHouse ожидает, что все типы, кроме чисел и строк, будут заключены в двойные кавычки. Если значение находится в двойных кавычках, ClickHouse пытается разобрать данные внутри кавычек, используя рекурсивный парсер, а затем пытается найти наиболее подходящий тип данных для него. Если значение не заключено в двойные кавычки, ClickHouse пытается разобрать его как число, и если значение не является числом, ClickHouse рассматривает его как строку.

Если вы не хотите, чтобы ClickHouse пытался определить сложные типы, используя некоторые парсеры и эвристику, вы можете отключить настройку input_format_csv_use_best_effort_in_schema_inference, и ClickHouse будет рассматривать все столбцы как Строки.

Если настройка input_format_csv_detect_header включена, ClickHouse попытается обнаружить заголовок с именами столбцов (и, возможно, типами) во время вывода схемы. Эта настройка включена по умолчанию.

Примеры:

Целые числа, числа с плавающей запятой, логические значения, строки:

Строки без кавычек:

Даты, Дата-время:

Массивы:

Если массив содержит null, ClickHouse будет использовать типы из других элементов массива:

Карты:

Вложенные массивы и карты:

Если ClickHouse не может определить тип внутри кавычек, потому что данные содержат только null, ClickHouse будет рассматривать это как Строку:

Пример с отключенной настройкой input_format_csv_use_best_effort_in_schema_inference:

Примеры автоопределения заголовков (когда input_format_csv_detect_header включен):

Только имена:

Имена и типы:

Обратите внимание, что заголовок может быть обнаружен только если хотя бы один столбец имеет не-строковый тип. Если все столбцы имеют строковый тип, заголовок не определяется:

CSV settings

input_format_csv_try_infer_numbers_from_strings

Включение этой настройки позволяет выводить числа из строковых значений.

Эта настройка отключена по умолчанию.

Пример:

TSV/TSKV

В форматах TSV/TSKV ClickHouse извлекает значение столбца из строки в соответствии с табличными разделителями и затем разбирает извлеченное значение, используя рекурсивный парсер, чтобы определить наиболее подходящий тип. Если тип не может быть определен, ClickHouse рассматривает это значение как Строку.

Если вы не хотите, чтобы ClickHouse пытался определить сложные типы, используя некоторые парсеры и эвристику, вы можете отключить настройку input_format_tsv_use_best_effort_in_schema_inference, и ClickHouse будет трактовать все столбцы как Строки.

Если настройка input_format_tsv_detect_header включена, ClickHouse попытается определить заголовок с именами столбцов (и, возможно, типами) во время вывода схемы. Эта настройка включена по умолчанию.

Примеры:

Целые числа, числа с плавающей запятой, логические значения, строки:

Даты, Дата-время:

Массивы:

Если ClickHouse не может определить тип, потому что данные содержат только null, ClickHouse будет трактовать это как Строку:

Пример с отключенной настройкой input_format_tsv_use_best_effort_in_schema_inference:

Примеры автоопределения заголовков (когда input_format_tsv_detect_header включен):

Только имена:

Имена и типы:

Обратите внимание, что заголовок может быть обнаружен только если хотя бы один столбец с нестроковым типом. Если все столбцы имеют строковый тип, заголовок не определяется:

Значения

В формате Values ClickHouse извлекает значение столбца из строки, а затем разбирает его с помощью рекурсивного парсера, аналогично тому, как разбираются литералы.

Примеры:

Целые числа, числа с плавающей запятой, булевы значения, строки:

Даты, ДатаВремя:

Массивы:

Если массив содержит null, ClickHouse будет использовать типы из других элементов массива:

Кортежи:

Карты:

Вложенные массивы, кортежи и карты:

Если ClickHouse не может определить тип, потому что данные содержат только null, будет выброшено исключение:

Пример с отключенной настройкой input_format_tsv_use_best_effort_in_schema_inference:

CustomSeparated

В формате CustomSeparated ClickHouse сначала извлекает все значения столбцов из строки в соответствии с указанными разделителями, а затем пытается вывести тип данных для каждого значения согласно правилу экранирования.

Если настройка input_format_custom_detect_header включена, ClickHouse попытается обнаружить заголовок с названиями столбцов (и, возможно, типами) во время вывода схемы. Эта настройка включена по умолчанию.

Пример

Пример автообнаружения заголовка (когда input_format_custom_detect_header включен):

Шаблон

В формате Шаблон ClickHouse сначала извлекает все значения столбцов из строки в соответствии с указанным шаблоном, а затем пытается вывести тип данных для каждого значения согласно своему правилу экранирования.

Пример

Предположим, у нас есть файл resultset со следующим содержимым:

И файл row_format со следующим содержимым:

Тогда мы можем выполнить следующие запросы:

Regexp

Аналогично Шаблону, в формате Regexp ClickHouse сначала извлекает все значения столбцов из строки в соответствии с указанным регулярным выражением, а затем пытается вывести тип данных для каждого значения в соответствии с заданным правилом экранирования.

Пример

Настройки для текстовых форматов

input_format_max_rows_to_read_for_schema_inference/input_format_max_bytes_to_read_for_schema_inference

Эти настройки контролируют количество данных, которые будут считаны во время вывода схемы. Чем больше строк/байтов читается, тем больше времени затрачивается на вывод схемы, но больше шансов правильно определить типы (особенно когда данные содержат много null).

Настройки по умолчанию:

  • 25000 для input_format_max_rows_to_read_for_schema_inference.
  • 33554432 (32 Мб) для input_format_max_bytes_to_read_for_schema_inference.

column_names_for_schema_inference

Список имен столбцов, которые будут использоваться в выводе схемы для форматов без явных имен столбцов. Указанные имена будут использоваться вместо значений по умолчанию c1,c2,c3,.... Формат: column1,column2,column3,....

Пример

schema_inference_hints

Список имен столбцов и типов, которые будут использоваться в выводе схемы вместо автоматически определенных типов. Формат: 'column_name1 column_type1, column_name2 column_type2, ...'. Эта настройка может быть использована для указания типов столбцов, которые не могут быть определены автоматически или для оптимизации схемы.

Пример

schema_inference_make_columns_nullable

Контролирует, будут ли предполагаемые типы Nullable во время вывода схемы для форматов без информации о nullability. Если настройка включена, все предполагаемые типы будут Nullable, если отключена, предполагаемый тип никогда не будет Nullable. Если установлена на auto, предполагаемый тип будет Nullable только если столбец содержит NULL в образце, который разбирается во время вывода схемы или метаданные файла содержат информацию о nullability столбца.

Включена по умолчанию.

Примеры

input_format_try_infer_integers

Если включено, ClickHouse будет пытаться вывести целые числа вместо чисел с плавающей запятой во время вывода схемы для текстовых форматов. Если все числа в столбце из образца данных являются целыми, результирующий тип будет Int64, если хотя бы одно число является дробным, результирующий тип будет Float64. Если образец данных содержит только целые числа, и хотя бы одно из них положительное и превышает Int64, ClickHouse выведет UInt64.

Включена по умолчанию.

Примеры

input_format_try_infer_datetimes

Если включено, ClickHouse будет пытаться вывести тип DateTime или DateTime64 из строковых полей при выводе схемы для текстовых форматов. Если все поля из столбца в образце данных были успешно разобраны как даты и времена, результирующий тип будет DateTime или DateTime64(9) (если у какой-либо даты и времени была дробная часть), если хотя бы одно поле не было разобрано как дата и время, результирующий тип будет String.

Включена по умолчанию.

Примеры

input_format_try_infer_datetimes_only_datetime64

Если включено, ClickHouse всегда будет выводить DateTime64(9), когда включена input_format_try_infer_datetimes, даже если значения даты и времени не содержат дробной части.

Отключена по умолчанию.

Примеры

Примечание: При разборе дат и времени во время вывода схемы учитывается настройка date_time_input_format.

input_format_try_infer_dates

Если включено, ClickHouse будет пытаться вывести тип Date из строковых полей при выводе схемы для текстовых форматов. Если все поля из столбца в образце данных были успешно разобраны как даты, результирующий тип будет Date, если хотя бы одно поле не было разобрано как дата, результирующий тип будет String.

Включена по умолчанию.

Примеры

input_format_try_infer_exponent_floats

Если включено, ClickHouse будет пытаться вывести числа с плавающей запятой в экспоненциальной форме для текстовых форматов (кроме JSON, где числа в экспоненциальной форме всегда выводятся).

Отключена по умолчанию.

Пример

Самодостаточные форматы

Самодостаточные форматы содержат информацию о структуре данных в самих данных, это может быть какой-то заголовок с описанием, бинарное дерево типов или некая таблица. Чтобы автоматически вывести схему из файлов в таких форматах, ClickHouse считывает часть данных, содержащую информацию о типах, и преобразует ее в схему таблицы ClickHouse.

Форматы с суффиксом -WithNamesAndTypes

ClickHouse поддерживает некоторые текстовые форматы с суффиксом -WithNamesAndTypes. Этот суффикс означает, что данные содержат две дополнительные строки с именами и типами столбцов перед фактическими данными. При выводе схемы для таких форматов ClickHouse считывает первые две строки и извлекает имена и типы столбцов.

Пример

JSON форматы с метаданными

Некоторые форматы ввода JSON (JSON, JSONCompact, JSONColumnsWithMetadata) содержат метаданные с именами и типами столбцов. При выводе схемы для таких форматов ClickHouse считывает эти метаданные.

Пример

Avro

В формате Avro ClickHouse считывает его схему из данных и преобразует ее в схему ClickHouse, используя следующие соответствия типов:

Avro тип данныхClickHouse тип данных
booleanBool
intInt32
int (date) *Date32
longInt64
floatFloat32
doubleFloat64
bytes, stringString
fixedFixedString(N)
enumEnum
array(T)Array(T)
union(null, T), union(T, null)Nullable(T)
nullNullable(Nothing)
string (uuid) *UUID
binary (decimal) *Decimal(P, S)

* Avro логические типы

Другие типы Avro не поддерживаются.

Parquet

В формате Parquet ClickHouse считывает его схему из данных и преобразует ее в схему ClickHouse с использованием следующих типов соответствий:

Parquet тип данныхClickHouse тип данных
BOOLBool
UINT8UInt8
INT8Int8
UINT16UInt16
INT16Int16
UINT32UInt32
INT32Int32
UINT64UInt64
INT64Int64
FLOATFloat32
DOUBLEFloat64
DATEDate32
TIME (ms)DateTime
TIMESTAMP, TIME (us, ns)DateTime64
STRING, BINARYString
DECIMALDecimal
LISTArray
STRUCTTuple
MAPMap

Другие типы Parquet не поддерживаются. По умолчанию все выведенные типы находятся внутри Nullable, но это можно изменить с помощью настройки schema_inference_make_columns_nullable.

Arrow

В формате Arrow ClickHouse считывает его схему из данных и преобразует ее в схему ClickHouse, используя следующие соответствия типов:

Arrow тип данныхClickHouse тип данных
BOOLBool
UINT8UInt8
INT8Int8
UINT16UInt16
INT16Int16
UINT32UInt32
INT32Int32
UINT64UInt64
INT64Int64
FLOAT, HALF_FLOATFloat32
DOUBLEFloat64
DATE32Date32
DATE64DateTime
TIMESTAMP, TIME32, TIME64DateTime64
STRING, BINARYString
DECIMAL128, DECIMAL256Decimal
LISTArray
STRUCTTuple
MAPMap

Другие типы Arrow не поддерживаются. По умолчанию все выведенные типы находятся внутри Nullable, но это можно изменить с помощью настройки schema_inference_make_columns_nullable.

ORC

В формате ORC ClickHouse считывает его схему из данных и преобразует ее в схему ClickHouse, используя следующие соответствия типов:

ORC тип данныхClickHouse тип данных
BooleanBool
TinyintInt8
SmallintInt16
IntInt32
BigintInt64
FloatFloat32
DoubleFloat64
DateDate32
TimestampDateTime64
String, Char, Varchar, BINARYString
DecimalDecimal
ListArray
StructTuple
MapMap

Другие типы ORC не поддерживаются. По умолчанию все выведенные типы находятся внутри Nullable, но это можно изменить с помощью настройки schema_inference_make_columns_nullable.

Native

Нативный формат используется внутри ClickHouse и содержит схему в данных. При выводе схемы ClickHouse считывает схему из данных без каких-либо преобразований.

Форматы с внешней схемой

Такие форматы требуют схемы, описывающей данные в отдельном файле на конкретном языке схемы. Чтобы автоматически вывести схему из файлов в таких форматах, ClickHouse считывает внешнюю схему из отдельного файла и преобразует ее в схему таблицы ClickHouse.

Protobuf

При выводе схемы для формата Protobuf ClickHouse использует следующие соответствия типов:

Protobuf тип данныхClickHouse тип данных
boolUInt8
floatFloat32
doubleFloat64
int32, sint32, sfixed32Int32
int64, sint64, sfixed64Int64
uint32, fixed32UInt32
uint64, fixed64UInt64
string, bytesString
enumEnum
repeated TArray(T)
message, groupTuple

CapnProto

При выводе схемы для формата CapnProto ClickHouse использует следующие соответствия типов:

CapnProto тип данныхClickHouse тип данных
BoolUInt8
Int8Int8
UInt8UInt8
Int16Int16
UInt16UInt16
Int32Int32
UInt32UInt32
Int64Int64
UInt64UInt64
Float32Float32
Float64Float64
Text, DataString
enumEnum
ListArray
structTuple
union(T, Void), union(Void, T)Nullable(T)

Форматы с фиксированной схемой

Данные в таких форматах всегда имеют одну и ту же схему.

LineAsString

В этом формате ClickHouse считывает всю строку из данных в единственный столбец с типом данных String. Выведенный тип для этого формата всегда String, а имя столбца — line.

Пример

JSONAsString

В этом формате ClickHouse считывает весь JSON-объект из данных в единственный столбец с типом данных String. Выведенный тип для этого формата всегда String, а имя столбца — json.

Пример

JSONAsObject

В этом формате ClickHouse считывает весь JSON-объект из данных в единственный столбец с типом данных Object('json'). Выведенный тип для этого формата всегда String, а имя столбца — json.

Примечание: Этот формат работает только если включен allow_experimental_object_type.

Пример

Режимы вывода схемы

Вывод схемы из набора файлов данных может работать в 2 различных режимах: default и union. Режим контролируется настройкой schema_inference_mode.

Режим по умолчанию

В режиме по умолчанию ClickHouse предполагает, что все файлы имеют одну и ту же схему, и пытается вывести схему, сначала считывая файлы по одному, пока не добьется успеха.

Пример:

Допустим, у нас есть 3 файла data1.jsonl, data2.jsonl и data3.jsonl со следующим содержимым:

data1.jsonl:

data2.jsonl:

data3.jsonl:

Попробуем использовать вывод схемы для этих 3 файлов:

Результат:

Как видим, у нас нет field3 из файла data3.jsonl. Это произошло потому, что ClickHouse сначала попытался вывести схему из файла data1.jsonl, не смог из-за того, что только нулевые значения для поля field2, а затем попытался вывести схему из data2.jsonl и добился успеха, поэтому данные из файла data3.jsonl не были прочитаны.

Режим объединения

В режиме объединения ClickHouse предполагает, что файлы могут иметь разные схемы, поэтому он выводит схемы всех файлов, а затем объединяет их в общую схему.

Допустим, у нас есть 3 файла data1.jsonl, data2.jsonl и data3.jsonl со следующим содержимым:

data1.jsonl:

data2.jsonl:

data3.jsonl:

Попробуем использовать вывод схемы для этих 3 файлов:

Результат:

Как видим, у нас есть все поля из всех файлов.

Примечание:

  • Поскольку некоторые файлы могут не содержать некоторые столбцы из результирующей схемы, режим объединения поддерживается только для форматов, которые поддерживают чтение подмножества столбцов (например, JSONEachRow, Parquet, TSVWithNames и т. д.) и не будет работать для других форматов (таких как CSV, TSV, JSONCompactEachRow и т. д.).
  • Если ClickHouse не может вывести схему из одного из файлов, будет выброшено исключение.
  • Если у вас много файлов, то чтение схемы из всех них может занять много времени.

Автоматическое определение формата

Если формат данных не указан и не может быть определен по расширению файла, ClickHouse попытается определить формат файла по его содержимому.

Примеры:

Допустим, у нас есть data со следующим содержимым:

Мы можем просмотреть и выполнить запросы к этому файлу без указания формата или структуры:

примечание

ClickHouse может определить только некоторые подмножества форматов, и это определение занимает некоторое время, всегда лучше явно указывать формат.