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 тип данных |
---|---|
boolean | Bool |
int | Int32 |
int (date) * | Date32 |
long | Int64 |
float | Float32 |
double | Float64 |
bytes , string | String |
fixed | FixedString(N) |
enum | Enum |
array(T) | Array(T) |
union(null, T) , union(T, null) | Nullable(T) |
null | Nullable(Nothing) |
string (uuid) * | UUID |
binary (decimal) * | Decimal(P, S) |
Другие типы Avro не поддерживаются.
Parquet
В формате Parquet ClickHouse считывает его схему из данных и преобразует ее в схему ClickHouse с использованием следующих типов соответствий:
Parquet тип данных | ClickHouse тип данных |
---|---|
BOOL | Bool |
UINT8 | UInt8 |
INT8 | Int8 |
UINT16 | UInt16 |
INT16 | Int16 |
UINT32 | UInt32 |
INT32 | Int32 |
UINT64 | UInt64 |
INT64 | Int64 |
FLOAT | Float32 |
DOUBLE | Float64 |
DATE | Date32 |
TIME (ms) | DateTime |
TIMESTAMP , TIME (us, ns) | DateTime64 |
STRING , BINARY | String |
DECIMAL | Decimal |
LIST | Array |
STRUCT | Tuple |
MAP | Map |
Другие типы Parquet не поддерживаются. По умолчанию все выведенные типы находятся внутри Nullable
, но это можно изменить с помощью настройки schema_inference_make_columns_nullable
.
Arrow
В формате Arrow ClickHouse считывает его схему из данных и преобразует ее в схему ClickHouse, используя следующие соответствия типов:
Arrow тип данных | ClickHouse тип данных |
---|---|
BOOL | Bool |
UINT8 | UInt8 |
INT8 | Int8 |
UINT16 | UInt16 |
INT16 | Int16 |
UINT32 | UInt32 |
INT32 | Int32 |
UINT64 | UInt64 |
INT64 | Int64 |
FLOAT , HALF_FLOAT | Float32 |
DOUBLE | Float64 |
DATE32 | Date32 |
DATE64 | DateTime |
TIMESTAMP , TIME32 , TIME64 | DateTime64 |
STRING , BINARY | String |
DECIMAL128 , DECIMAL256 | Decimal |
LIST | Array |
STRUCT | Tuple |
MAP | Map |
Другие типы Arrow не поддерживаются. По умолчанию все выведенные типы находятся внутри Nullable
, но это можно изменить с помощью настройки schema_inference_make_columns_nullable
.
ORC
В формате ORC ClickHouse считывает его схему из данных и преобразует ее в схему ClickHouse, используя следующие соответствия типов:
ORC тип данных | ClickHouse тип данных |
---|---|
Boolean | Bool |
Tinyint | Int8 |
Smallint | Int16 |
Int | Int32 |
Bigint | Int64 |
Float | Float32 |
Double | Float64 |
Date | Date32 |
Timestamp | DateTime64 |
String , Char , Varchar , BINARY | String |
Decimal | Decimal |
List | Array |
Struct | Tuple |
Map | Map |
Другие типы ORC не поддерживаются. По умолчанию все выведенные типы находятся внутри Nullable
, но это можно изменить с помощью настройки schema_inference_make_columns_nullable
.
Native
Нативный формат используется внутри ClickHouse и содержит схему в данных. При выводе схемы ClickHouse считывает схему из данных без каких-либо преобразований.
Форматы с внешней схемой
Такие форматы требуют схемы, описывающей данные в отдельном файле на конкретном языке схемы. Чтобы автоматически вывести схему из файлов в таких форматах, ClickHouse считывает внешнюю схему из отдельного файла и преобразует ее в схему таблицы ClickHouse.
Protobuf
При выводе схемы для формата Protobuf ClickHouse использует следующие соответствия типов:
Protobuf тип данных | ClickHouse тип данных |
---|---|
bool | UInt8 |
float | Float32 |
double | Float64 |
int32 , sint32 , sfixed32 | Int32 |
int64 , sint64 , sfixed64 | Int64 |
uint32 , fixed32 | UInt32 |
uint64 , fixed64 | UInt64 |
string , bytes | String |
enum | Enum |
repeated T | Array(T) |
message , group | Tuple |
CapnProto
При выводе схемы для формата CapnProto ClickHouse использует следующие соответствия типов:
CapnProto тип данных | ClickHouse тип данных |
---|---|
Bool | UInt8 |
Int8 | Int8 |
UInt8 | UInt8 |
Int16 | Int16 |
UInt16 | UInt16 |
Int32 | Int32 |
UInt32 | UInt32 |
Int64 | Int64 |
UInt64 | UInt64 |
Float32 | Float32 |
Float64 | Float64 |
Text , Data | String |
enum | Enum |
List | Array |
struct | Tuple |
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 может определить только некоторые подмножества форматов, и это определение занимает некоторое время, всегда лучше явно указывать формат.