Автоматический вывод схемы из входных данных
ClickHouse может автоматически определить структуру входных данных почти во всех поддерживаемых Форматах ввода. Этот документ опишет, когда используется вывод схемы, как он работает с различными форматами ввода и какие настройки могут его контролировать.
Использование
Вывод схемы используется, когда ClickHouse необходимо читать данные в конкретном формате данных, а структура неизвестна.
Табличные функции file, s3, url, hdfs, azureBlobStorage.
Эти табличные функции имеют необязательный аргумент structure
с структурой входных данных. Если этот аргумент не указан или установлен в auto
, структура будет выведена из данных.
Пример:
Предположим, у нас есть файл hobbies.jsonl
в формате JSONEachRow в директории user_files
с содержимым:
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 в примерах.
Целые числа, числа с плавающей запятой, булевы, строки:
Даты, DateTime:
Массивы:
Если массив содержит 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, если все соответствующие настройки включены (все они включены по умолчанию), и мы можем избежать ошибок, подобных Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps
, во время вывода схемы, используя тип 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 настройки
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 будет пытаться определить заголовок с именами колонок (и, возможно, типами) во время вывода схемы. Эта настройка включена по умолчанию.
Примеры:
Целые числа, числа с плавающей точкой, логические значения, строки:
Даты, даты и время:
Массивы:
Если массив содержит null, ClickHouse будет использовать типы из других элементов массива:
Кортежи:
Карты:
Вложенные массивы, кортежи и карты:
Если ClickHouse не может определить тип, потому что данные содержат только null, ClickHouse будет рассматривать это как строку:
Пример с отключенной настройкой input_format_tsv_use_best_effort_in_schema_inference
:
Примеры автоматического обнаружения заголовков (когда input_format_tsv_detect_header
включен):
Только имена:
Имена и типы:
Обратите внимание, что заголовок можно обнаружить только если есть хотя бы одна колонка с нестроковым типом. Если все колонки имеют строковый тип, заголовок не обнаруживается:
Значения
В формате Значений 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 Mb) для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
в выводе схемы для форматов без информации о возможности null.
Если настройка включена, все выводимые типы будут Nullable
, если отключена, выводимый тип никогда не будет Nullable
, если установлено значение auto
, выводимый тип будет Nullable
только если колонка содержит NULL
в образце, который разбирается во время вывода схемы, или метаданные файла содержат информацию о возможности null для колонки.
Включено по умолчанию.
Примеры
input_format_try_infer_integers
Эта настройка не применяется к типу данных JSON
.
Если включено, ClickHouse будет пытаться определить целые числа вместо чисел с плавающей запятой в выводе схемы для текстовых форматов.
Если все числа в колонке из выборки являются целыми, результатом будет Int64
, если хотя бы одно число является числом с плавающей запятой, тип результата будет Float64
.
Если выборка данных содержит только целые числа и хотя бы одно целое число положительно и превышает Int64
, ClickHouse будет определять UInt64
.
Включено по умолчанию.
Примеры
input_format_try_infer_datetimes
Если включено, ClickHouse будет пытаться определить тип DateTime
или DateTime64
из строковых полей в выводе схемы для текстовых форматов.
Если все поля из колонки в выборке данных были успешно разобраны как даты и время, тип результата будет DateTime
или DateTime64(9)
(если какое-либо значение даты и времени имело дробную часть),
если хотя бы одно поле не было разобрано как дата и время, тип результата будет String
.
Включено по умолчанию.
Примеры
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
, не смог, из-за наличия только null для поля 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 может обнаружить только некоторый подмножество форматов, и это обнаружение занимает некоторое время, поэтому всегда лучше явно указывать формат.