Uso
structure, que especifica la estructura de los datos de entrada. Si no se especifica este argumento o se establece en auto, la estructura se inferirá de los datos.
Ejemplo:
Supongamos que tenemos un archivo hobbies.jsonl en formato JSONEachRow en el directorio user_files con este contenido:
JSONEachRow se determinó automáticamente por la extensión del archivo .jsonl.
Puede ver la estructura detectada automáticamente con la consulta DESCRIBE:
CREATE TABLE, la estructura de la tabla se inferirá automáticamente a partir de los datos.
Ejemplo:
Usemos el archivo hobbies.jsonl. Podemos crear una tabla con el motor File a partir de los datos de este archivo:
clickhouse-local
clickhouse-local tiene un parámetro opcional -S/--structure que define la estructura de los datos de entrada. Si este parámetro no se especifica o se establece en auto, la estructura se inferirá a partir de los datos.
Ejemplo:
Usemos el archivo hobbies.jsonl. Podemos consultar los datos de este archivo con clickhouse-local:
Uso de la estructura de la tabla de inserción
file/s3/url/hdfs para insertar datos en una tabla,
existe la opción de usar la estructura de la tabla de inserción en lugar de extraerla de los datos.
Esto puede mejorar el rendimiento de la inserción, porque la inferencia de esquemas puede llevar algo de tiempo. Además, resulta útil cuando la tabla tiene un esquema optimizado, de modo que
no se realizarán conversiones entre tipos.
Hay una configuración especial use_structure_from_insertion_table_in_table_functions
que controla este comportamiento. Tiene 3 valores posibles:
- 0 - la función de tabla extraerá la estructura de los datos.
- 1 - la función de tabla usará la estructura de la tabla de inserción.
- 2 - ClickHouse determinará automáticamente si es posible usar la estructura de la tabla de inserción o la inferencia de esquemas. Valor predeterminado.
hobbies1 con la siguiente estructura:
hobbies.jsonl:
hobbies2 con la siguiente estructura:
hobbies.jsonl:
SELECT están presentes en la tabla, por lo que ClickHouse usará la estructura de la tabla de inserción.
Ten en cuenta que esto solo funcionará con formatos de entrada que admitan leer un subconjunto de columnas, como JSONEachRow, TSKV, Parquet, etc. (por ejemplo, no funcionará con el formato TSV).
Ejemplo 3:
Vamos a crear la tabla hobbies3 con la siguiente estructura:
hobbies.jsonl:
id se usa en la consulta SELECT, pero la tabla no tiene esa columna (tiene una columna llamada identifier),
por lo que ClickHouse no puede usar la estructura de la tabla de inserción y se utilizará la inferencia de esquemas.
Ejemplo 4:
Vamos a crear la tabla hobbies4 con la siguiente estructura:
hobbies.jsonl:
hobbies en la consulta SELECT para insertarla en la tabla, por lo que ClickHouse no puede usar la estructura de la tabla de inserción y se utilizará la inferencia de esquemas.
Caché de inferencia de esquemas
schema_inference_cache_max_elements_for_{file/s3/hdfs/url/azure}- el número máximo de esquemas almacenados en caché para la función de tabla correspondiente. El valor predeterminado es4096. Estos ajustes deben establecerse en la configuración del servidor.schema_inference_use_cache_for_{file,s3,hdfs,url,azure}- permite activar o desactivar el uso de la caché para la inferencia de esquemas. Estos ajustes pueden usarse en consultas.
url no contengan información sobre la hora de la última modificación; para ese caso, existe un ajuste especial
schema_inference_cache_require_modification_time_for_url. Deshabilitar este ajuste permite usar el esquema de la caché sin la hora de la última modificación para esos archivos.
También existe una system table schema_inference_cache con todos los esquemas actualmente en caché y la consulta del sistema SYSTEM CLEAR SCHEMA CACHE [FOR File/S3/URL/HDFS]
que permite limpiar la caché de esquemas para todas las fuentes o para una fuente específica.
Ejemplos:
Intentemos inferir la estructura de un conjunto de datos de ejemplo de S3 github-2022.ndjson.gz y veamos cómo funciona la caché de inferencia de esquemas:
system.schema_inference_cache:
Formatos de texto
input_format_max_rows_to_read_for_schema_inference (25000 de forma predeterminada) y input_format_max_bytes_to_read_for_schema_inference (32Mb de forma predeterminada).
De forma predeterminada, todos los tipos inferidos son Nullable, pero puedes cambiarlo configurando schema_inference_make_columns_nullable (consulta ejemplos en la sección de ajustes).
Formatos JSON
null, ClickHouse utilizará los tipos de los demás elementos del array:
input_format_json_infer_array_of_dynamic_from_array_of_different_types está habilitado (habilitado por defecto), tendrá el tipo Array(Dynamic):
input_format_json_try_infer_named_tuples_from_objects, durante la inferencia de esquemas ClickHouse intentará inferir un Tuple con nombre a partir de objetos JSON.
El Tuple con nombre resultante contendrá todos los elementos de todos los objetos JSON correspondientes presentes en los datos de muestra.
input_format_json_infer_array_of_dynamic_from_array_of_different_types está desactivada, consideramos los Arrays con elementos de distintos tipos como Tuples sin nombre en los formatos JSON.
null o están vacíos, usamos los tipos de los valores correspondientes de las demás filas:
input_format_json_read_objects_as_strings e input_format_json_try_infer_named_tuples_from_objects estén deshabilitadas.
String si la configuración input_format_json_infer_incomplete_types_as_strings está habilitada; de lo contrario, se generará una excepción:
Ajustes de JSON
input_format_json_try_infer_numbers_from_strings
input_format_json_try_infer_named_tuples_from_objects
Query
Response
Query
Response
input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects
input_format_json_try_infer_named_tuples_from_objects está habilitado) en lugar de generar una excepción.
Permite leer objetos JSON como Tuples con nombre incluso cuando hay rutas ambiguas.
Deshabilitada de forma predeterminada.
Ejemplos
Con la configuración deshabilitada:
Query
Response
Query
Response
input_format_json_read_objects_as_strings
input_format_json_try_infer_named_tuples_from_objects está deshabilitada.
input_format_json_read_numbers_as_strings
input_format_json_read_bools_as_numbers
input_format_json_read_bools_as_strings
input_format_json_read_arrays_as_strings
input_format_json_infer_incomplete_types_as_strings
Null/{}/[] en la muestra de datos durante la inferencia de esquemas.
En los formatos JSON, cualquier valor puede leerse como String si todas las configuraciones correspondientes están habilitadas (todas lo están de forma predeterminada), y así se evitan errores como Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps durante la inferencia de esquemas
al usar el tipo String para claves con tipos desconocidos.
Ejemplo:
Query
Response
CSV
input_format_csv_use_best_effort_in_schema_inference
y ClickHouse tratará todas las columnas como Strings.
Si la configuración input_format_csv_detect_header está habilitada, ClickHouse intentará detectar el encabezado con los nombres de las columnas (y, posiblemente, los tipos) mientras infiere el esquema. Esta configuración está habilitada de forma predeterminada.
Ejemplos:
Enteros, flotantes, booleanos, cadenas:
input_format_csv_use_best_effort_in_schema_inference deshabilitada:
input_format_csv_detect_header está habilitada):
Solo nombres:
Configuración de CSV
input_format_csv_try_infer_numbers_from_strings
TSV/TSKV
input_format_tsv_use_best_effort_in_schema_inference
y ClickHouse tratará todas las columnas como Strings.
Si la configuración input_format_tsv_detect_header está habilitada, ClickHouse intentará detectar el encabezado con nombres de columnas (y, posiblemente, tipos) al inferir el esquema. Esta configuración está habilitada de forma predeterminada.
Ejemplos:
Enteros, flotantes, booleanos, cadenas:
input_format_tsv_use_best_effort_in_schema_inference deshabilitada:
input_format_tsv_detect_header está habilitado):
Solo nombres:
Valores
input_format_tsv_use_best_effort_in_schema_inference desactivado:
CustomSeparated
input_format_custom_detect_header está habilitada, ClickHouse intentará detectar el encabezado con los nombres de las columnas (y quizá los tipos) mientras infiere el esquema. Esta configuración está habilitada de forma predeterminada.
Ejemplo
input_format_custom_detect_header está habilitada):
Template
resultset con el siguiente contenido:
row_format con este contenido:
Regexp
Configuración de los formatos de texto
input_format_max_rows_to_read_for_schema_inference/input_format_max_bytes_to_read_for_schema_inference
25000parainput_format_max_rows_to_read_for_schema_inference.33554432(32 Mb) parainput_format_max_bytes_to_read_for_schema_inference.
column_names_for_schema_inference
c1,c2,c3,.... El formato es: column1,column2,column3,....
Ejemplo
schema_inference_hints
schema_inference_make_columns_nullable $
Nullable durante la inferencia de esquema para formatos que no incluyen información sobre nulabilidad. Posibles valores:
- 0 - el tipo inferido nunca será
Nullable, - 1 - todos los tipos inferidos serán
Nullable, - 2 o ‘auto’: para los formatos de texto, el tipo inferido será
Nullablesolo si la columna contieneNULLen una muestra analizada durante la inferencia del esquema; para los formatos con tipado fuerte (Parquet, ORC, Arrow), la información sobre nulabilidad se toma de los metadatos del archivo, - 3 - para formatos de texto, use
Nullable; para los formatos con tipado fuerte, use los metadatos del archivo.
input_format_try_infer_integers
Esta configuración no se aplica al tipo de datos
JSON.Int64; si al menos un número es de coma flotante, el tipo de resultado será Float64.
Si los datos de muestra contienen solo enteros y al menos uno es positivo y provoca un desbordamiento de Int64, ClickHouse inferirá UInt64.
Habilitada de forma predeterminada.
Ejemplos
input_format_try_infer_datetimes
DateTime o DateTime64 a partir de campos de tipo cadena durante la inferencia de esquemas para formatos de texto.
Si todos los campos de una columna en los datos de muestra se analizaron correctamente como valores datetime, el tipo resultante será DateTime o DateTime64(9) (si algún valor datetime tenía parte fraccionaria);
si al menos un campo no se pudo analizar como datetime, el tipo resultante será String.
Habilitado de forma predeterminada.
Ejemplos
input_format_try_infer_datetimes_only_datetime64
DateTime64(9) cuando input_format_try_infer_datetimes esté habilitado, incluso si los valores de fecha y hora no contienen una parte fraccionaria.
Está deshabilitado de forma predeterminada.
Ejemplos
input_format_try_infer_dates
Date a partir de campos de cadena durante la inferencia del esquema para formatos de texto.
Si todos los campos de una columna en los datos de muestra se interpretan correctamente como fechas, el tipo resultante será Date;
si al menos un campo no se interpreta como fecha, el tipo resultante será String.
Habilitado de forma predeterminada.
Ejemplos
input_format_try_infer_exponent_floats
Formatos autodescriptivos
Formatos con el sufijo -WithNamesAndTypes
Formatos JSON con metadatos
Avro
No se admiten otros tipos de Avro.
Parquet
No se admiten otros tipos de Parquet.
Arrow
Los demás tipos de Arrow no son compatibles.
ORC
Otros tipos de ORC no son compatibles.
Native
Formatos con esquema externo
Protobuf
CapnProto
Formatos binarios con tipado fuerte
input_format_max_rows_to_read_for_schema_inference filas o input_format_max_bytes_to_read_for_schema_inference bytes) y extrae
el tipo (y posiblemente el nombre) de cada valor a partir de los datos, y luego convierte esos tipos en tipos de ClickHouse.
MsgPack
input_format_msgpack_number_of_columns. ClickHouse usa las siguientes correspondencias de tipos:
De forma predeterminada, todos los tipos inferidos se envuelven en
Nullable, pero esto puede cambiarse mediante el SETTING schema_inference_make_columns_nullable.
BSONEachRow
De forma predeterminada, todos los tipos inferidos están dentro de
Nullable, pero esto se puede cambiar usando la SETTING schema_inference_make_columns_nullable.
Formatos con esquema constante
LineAsString
String. El tipo inferido para este formato es siempre String y el nombre de la columna es line.
Ejemplo
JSONAsString
String. El tipo inferido para este formato es siempre String y el nombre de la columna es json.
Ejemplo
JSONAsObject
JSON. El tipo inferido para este formato es siempre JSON y el nombre de la columna es json.
Ejemplo
Modos de inferencia de esquemas
default y union.
El modo se controla mediante la SETTING schema_inference_mode.
Modo predeterminado
data1.jsonl, data2.jsonl y data3.jsonl con el siguiente contenido:
data1.jsonl:
data2.jsonl:
data3.jsonl:
Query
Response
field3 del archivo data3.jsonl.
Esto ocurre porque ClickHouse primero intentó inferir el esquema a partir del archivo data1.jsonl, pero falló porque el campo field2 solo contenía valores nulos,
y luego intentó inferir el esquema a partir de data2.jsonl y lo consiguió, por lo que no se leyeron los datos del archivo data3.jsonl.
Modo union
data1.jsonl, data2.jsonl y data3.jsonl con el siguiente contenido:
data1.jsonl:
data2.jsonl:
data3.jsonl:
Query
Response
- Dado que es posible que algunos archivos no contengan algunas columnas del esquema resultante, el modo union solo es compatible con formatos que admiten leer un subconjunto de columnas (como JSONEachRow, Parquet, TSVWithNames, etc.) y no funcionará con otros formatos (como CSV, TSV, JSONCompactEachRow, etc.).
- Si ClickHouse no puede inferir el esquema de uno de los archivos, se lanzará una excepción.
- Si tiene muchos archivos, leer el esquema de todos ellos puede llevar mucho tiempo.
Detección automática del formato
data con el siguiente contenido:
ClickHouse solo puede detectar algunos formatos, y esta detección lleva algo de tiempo; siempre es mejor especificar el formato explícitamente.