clickhouse-local o en buckets de S3, y/o para crear esquemas automáticamente antes de cargar los datos en ClickHouse.
Cuándo usar la inferencia de tipos
- Estructura consistente - Los datos a partir de los que se van a inferir los tipos contienen todas las claves que te interesan. La inferencia de tipos se basa en muestrear los datos hasta un número máximo de filas o bytes. Los datos que queden fuera de la muestra y contengan columnas adicionales se ignorarán y no podrán consultarse.
- Tipos consistentes - Los tipos de datos de claves específicas deben ser compatibles; es decir, debe ser posible convertir automáticamente un tipo en otro.
Detección de tipos
NDJSON. En esta sección, exploramos un dataset más complejo con estructuras anidadas: el arXiv dataset, que contiene 2,5 millones de artículos académicos. Cada fila de este dataset, distribuido en formato NDJSON, representa un artículo académico publicado. A continuación se muestra una fila de ejemplo:
Tuple y Array.
Este conjunto de datos se almacena en un bucket público de S3 en s3://datasets-documentation/arxiv/arxiv.json.gz.
Puede ver que el conjunto de datos anterior contiene objetos JSON anidados. Aunque conviene definir y versionar los esquemas, la inferencia permite deducir los tipos a partir de los datos. Esto permite generar automáticamente el DDL del esquema, evitando tener que crearlo manualmente y acelerando el proceso de desarrollo.
Detección automática del formatoAdemás de detectar el esquema, la inferencia de esquemas JSON deduce automáticamente el formato de los datos a partir de la extensión y el contenido del archivo. Como resultado, el archivo anterior se detecta automáticamente como NDJSON.
DESCRIBE, se muestran los tipos que se inferirán.
Evite los valores NULLPuede ver que muchas de las columnas se detectan como Nullable. No recomendamos usar el tipo Nullable cuando no sea absolutamente necesario. Puede usar schema_inference_make_columns_nullable para controlar cuándo se aplica Nullable.
String, y que la columna update_date se ha detectado correctamente como Date. La columna versions se ha creado como Array(Tuple(created String, version String)) para almacenar una lista de objetos, mientras que authors_parsed se ha definido como Array(Array(String)) para arrays anidados.
Control de la detección de tiposLa detección automática de fechas y fechas con hora puede controlarse mediante las opciones de configuración
input_format_try_infer_dates y input_format_try_infer_datetimes, respectivamente (ambas activadas de forma predeterminada). La inferencia de objetos como tuplas se controla mediante la opción de configuración input_format_json_try_infer_named_tuples_from_objects. Otras opciones de configuración que controlan la inferencia de esquemas para JSON, como la detección automática de números, pueden consultarse aquí.Consulta de JSON
Crear tablas
CREATE AS EMPTY hace que se infiera el DDL de la tabla y se cree la tabla. Esto no carga ningún dato:
SHOW CREATE TABLE:
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). Si la detección no es correcta, puedes proporcionar indicaciones como se describe aquí.
Crear tablas a partir de fragmentos
Carga de datos JSON
INSERT INTO SELECT:
PrettyJSONEachRow para mostrar las filas con su estructura original:
Manejo de errores
input_format_allow_errors_num y input_format_allow_errors_ratio para permitir que se ignore una determinada cantidad de filas si los datos están provocando errores de inserción. Además, se pueden proporcionar indicaciones para facilitar la inferencia.
Trabajar con datos semiestructurados y dinámicos
JSON específico.
Si sabe que su JSON es muy dinámico, con muchas claves únicas y varios tipos para las mismas claves, le recomendamos no usar la inferencia de esquemas con JSONEachRow para intentar deducir una columna para cada clave, incluso si los datos están en formato JSON delimitado por saltos de línea.
Considere el siguiente ejemplo de una versión ampliada del Python PyPI dataset anterior. Aquí hemos añadido una columna arbitraria de tags con pares clave-valor aleatorios.
JSONEachRow se utiliza para la inferencia. Esto intenta inferir un tipo de columna por cada clave del JSON; en la práctica, intenta aplicar un esquema estático a los datos sin usar el tipo JSON.
Con miles de columnas únicas, este enfoque de inferencia es lento. Como alternativa, puedes usar el formato JSONAsObject.
JSONAsObject trata toda la entrada como un único objeto JSON y la almacena en una sola columna de tipo JSON, por lo que se adapta mejor a payloads JSON muy dinámicos o anidados.
sample.json con el siguiente JSON delimitado por saltos de línea:
a sea de tipo Nullable(String).
Coerción de tiposEsta coerción de tipos se puede controlar mediante una serie de ajustes. El ejemplo anterior depende del ajuste
input_format_json_read_numbers_as_strings.DESCRIBE falla:
JSONAsObject trata cada fila como un único tipo JSON (que permite que una misma columna tenga varios tipos). Esto es esencial: