Utilisation
structure, qui définit la structure des données d’entrée. Si cet argument n’est pas spécifié ou s’il est défini sur auto, la structure sera inférée à partir des données.
Exemple :
Supposons que nous ayons un fichier hobbies.jsonl au format JSONEachRow dans le répertoire user_files, avec le contenu suivant :
JSONEachRow a été détecté automatiquement à partir de l’extension de fichier .jsonl.
Vous pouvez afficher la structure détectée automatiquement à l’aide de la requête DESCRIBE :
CREATE TABLE, la structure de la table sera automatiquement inférée à partir des données.
Exemple :
Utilisons le fichier hobbies.jsonl. Nous pouvons créer une table avec le moteur File à partir des données de ce fichier :
clickhouse-local
clickhouse-local dispose d’un paramètre facultatif -S/--structure permettant de définir la structure des données d’entrée. Si ce paramètre n’est pas renseigné ou s’il est défini sur auto, la structure sera inférée à partir des données.
Exemple :
Utilisons le fichier hobbies.jsonl. Nous pouvons interroger les données de ce fichier avec clickhouse-local :
Utilisation de la structure de la table d’insertion
file/s3/url/hdfs sont utilisées pour insérer des données dans une table,
il est possible d’utiliser la structure de la table d’insertion au lieu de l’extraire des données.
Cela peut améliorer les performances d’insertion, car l’inférence de schéma peut prendre un certain temps. Cela est également utile lorsque la table possède un schéma optimisé, car
aucune conversion de type ne sera alors effectuée.
Il existe un paramètre spécial use_structure_from_insertion_table_in_table_functions
qui contrôle ce comportement. Il a 3 valeurs possibles :
- 0 - la fonction de table extraira la structure des données.
- 1 - la fonction de table utilisera la structure de la table d’insertion.
- 2 - ClickHouse déterminera automatiquement s’il est possible d’utiliser la structure de la table d’insertion ou de recourir à l’inférence de schéma. Valeur par défaut.
hobbies1 avec la structure suivante :
hobbies.jsonl :
hobbies2 avec la structure suivante :
hobbies.jsonl :
SELECT sont présentes dans la table, donc ClickHouse utilisera la structure de la table d’insertion.
Notez que cela ne fonctionne que pour les formats d’entrée qui prennent en charge la lecture d’un sous-ensemble de colonnes, comme JSONEachRow, TSKV, Parquet, etc. (cela ne fonctionne donc pas, par exemple, avec le format TSV).
Exemple 3 :
Créons la table hobbies3 avec la structure suivante :
hobbies.jsonl :
id est utilisée dans la requête SELECT, mais la table ne contient pas cette colonne (elle contient une colonne nommée identifier) ;
ClickHouse ne peut donc pas utiliser la structure de la table d’insertion, et l’inférence de schéma sera utilisée.
Exemple 4 :
Créons la table hobbies4 avec la structure suivante :
hobbies.jsonl :
hobbies dans la requête SELECT avant son insertion dans la table ; ClickHouse ne peut donc pas utiliser la structure de la table d’insertion, et l’inférence de schéma sera utilisée.
Cache d’inférence de schéma
schema_inference_cache_max_elements_for_{file/s3/hdfs/url/azure}- le nombre maximal de schémas mis en cache pour la fonction de table correspondante. La valeur par défaut est4096. Ces paramètres doivent être définis dans la configuration du serveur.schema_inference_use_cache_for_{file,s3,hdfs,url,azure}- permet d’activer ou de désactiver l’utilisation du cache pour l’inférence de schéma. Ces paramètres peuvent être utilisés dans les requêtes.
url peuvent ne pas contenir d’informations sur la date de dernière modification ; dans ce cas, il existe un paramètre spécial
schema_inference_cache_require_modification_time_for_url. Désactiver ce paramètre permet d’utiliser le schéma du cache sans date de dernière modification pour ces fichiers.
Il existe également une table système schema_inference_cache contenant tous les schémas actuellement présents dans le cache, ainsi que la requête système SYSTEM CLEAR SCHEMA CACHE [FOR File/S3/URL/HDFS]
qui permet de vider le cache d’inférence de schéma pour toutes les sources ou pour une source spécifique.
Exemples :
Essayons d’inférer la structure d’un jeu de données d’exemple depuis S3 github-2022.ndjson.gz et voyons comment fonctionne le cache d’inférence de schéma :
system.schema_inference_cache :
Formats textuels
input_format_max_rows_to_read_for_schema_inference (25000 par défaut) et input_format_max_bytes_to_read_for_schema_inference (32Mb par défaut).
Par défaut, tous les types inférés sont Nullable, mais vous pouvez modifier ce comportement en définissant schema_inference_make_columns_nullable (voir des exemples dans la section paramètres).
Formats JSON
null, ClickHouse utilisera les types des autres éléments du tableau :
input_format_json_infer_array_of_dynamic_from_array_of_different_types est activé (activé par défaut), il aura le type Array(Dynamic) :
input_format_json_try_infer_named_tuples_from_objects est activé, ClickHouse tentera, lors de l’inférence de schéma, d’inférer un Tuple nommé à partir d’objets JSON.
Le Tuple nommé obtenu contiendra tous les éléments de tous les objets JSON correspondants présents dans les données d’échantillon.
input_format_json_infer_array_of_dynamic_from_array_of_different_types est désactivé, les Arrays dont les éléments sont de types différents sont traités comme des Tuples non nommés dans les formats JSON.
null ou vides, nous utilisons les types des valeurs correspondantes présentes dans les autres lignes :
input_format_json_read_objects_as_strings et input_format_json_try_infer_named_tuples_from_objects sont désactivés.
String sera utilisé si le paramètre input_format_json_infer_incomplete_types_as_strings est activé ; sinon, une exception sera levée :
Paramètres 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 activé), au lieu de lever une exception.
Cela permet de lire des objets JSON comme des tuples nommés même en présence de chemins ambigus.
Désactivé par défaut.
Exemples
Avec le paramètre désactivé :
Query
Response
Query
Response
input_format_json_read_objects_as_strings
input_format_json_try_infer_named_tuples_from_objects est désactivé.
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/{}/[] dans l’échantillon de données lors de l’inférence de schéma.
Dans les formats JSON, toute valeur peut être lue comme String si tous les paramètres correspondants sont activés (ils le sont tous par défaut), ce qui permet d’éviter des erreurs comme Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps lors de l’inférence de schéma
en utilisant le type String pour les clés dont le type est inconnu.
Exemple :
Query
Response
CSV
input_format_csv_use_best_effort_in_schema_inference
et ClickHouse traitera alors toutes les colonnes comme des Strings.
Si le paramètre input_format_csv_detect_header est activé, ClickHouse essaiera de détecter l’en-tête avec les noms de colonnes (et éventuellement les types) lors de l’inférence du schéma. Ce paramètre est activé par défaut.
Exemples :
Entiers, Floats, Bools, Strings:
input_format_csv_use_best_effort_in_schema_inference désactivé :
input_format_csv_detect_header est activé) :
Noms uniquement :
Paramètres CSV
input_format_csv_try_infer_numbers_from_strings
TSV/TSKV
input_format_tsv_use_best_effort_in_schema_inference
et ClickHouse traitera alors toutes les colonnes comme des Strings.
Si le paramètre input_format_tsv_detect_header est activé, ClickHouse essaiera de détecter l’en-tête contenant les noms de colonnes (et éventuellement les types) lors de l’inférence du schéma. Ce paramètre est activé par défaut.
Exemples :
Entiers, Floats, Bools, Strings:
input_format_tsv_use_best_effort_in_schema_inference désactivé :
input_format_tsv_detect_header est activé) :
Noms uniquement :
Valeurs
input_format_tsv_use_best_effort_in_schema_inference désactivé :
CustomSeparated
input_format_custom_detect_header est activé, ClickHouse essaiera de détecter l’en-tête contenant les noms de colonnes (et éventuellement les types) lors de l’inférence du schéma. Ce paramètre est activé par défaut.
Exemple
input_format_custom_detect_header est activé) :
Template
resultset avec le contenu suivant :
row_format avec le contenu suivant :
Regexp
Paramètres des formats texte
input_format_max_rows_to_read_for_schema_inference/input_format_max_bytes_to_read_for_schema_inference
25000pourinput_format_max_rows_to_read_for_schema_inference.33554432(32 Mb) pourinput_format_max_bytes_to_read_for_schema_inference.
column_names_for_schema_inference
c1,c2,c3,.... Format : column1,column2,column3,....
Exemple
schema_inference_hints
schema_inference_make_columns_nullable $
Nullable lors de l’inférence de schéma pour les formats ne contenant pas d’information sur la nullabilité. Valeurs possibles :
- 0 - le type inféré ne sera jamais
Nullable, - 1 - tous les types inférés seront
Nullable, - 2 ou ‘auto’ - pour les formats texte, le type inféré sera
Nullableuniquement si la colonne contientNULLdans un échantillon analysé lors de l’inférence du schéma ; pour les formats fortement typés (Parquet, ORC, Arrow), les informations de nullabilité sont extraites des métadonnées du fichier, - 3 - pour les formats texte, utilisez
Nullable; pour les formats fortement typés, utilisez les métadonnées du fichier.
input_format_try_infer_integers
Ce paramètre ne s’applique pas au type de données
JSON.Int64 ; si au moins un nombre est à virgule flottante, le type résultant sera Float64.
Si les données d’échantillon ne contiennent que des entiers et qu’au moins l’un d’eux est positif et dépasse Int64, ClickHouse inférera UInt64.
Activé par défaut.
Exemples
input_format_try_infer_datetimes
DateTime ou DateTime64 à partir des champs de type chaîne lors de l’inférence du schéma pour les formats texte.
Si tous les champs d’une colonne dans les données d’exemple ont pu être interprétés avec succès comme des valeurs datetime, le type résultant sera DateTime ou DateTime64(9) (si au moins une valeur datetime comportait une partie fractionnaire),
si au moins un champ n’a pas pu être interprété comme une valeur datetime, le type résultant sera String.
Activé par défaut.
Exemples
input_format_try_infer_datetimes_only_datetime64
DateTime64(9) lorsque input_format_try_infer_datetimes est activé, même si les valeurs de date et d’heure ne comportent pas de partie fractionnaire.
Désactivé par défaut.
Exemples
input_format_try_infer_dates
Date à partir des champs de chaîne lors de l’inférence du schéma pour les formats texte.
Si tous les champs d’une colonne dans les données d’échantillon ont été correctement interprétés comme des dates, le type résultant sera Date,
si au moins un champ n’a pas pu être interprété comme une date, le type résultant sera String.
Activé par défaut.
Exemples
input_format_try_infer_exponent_floats
Formats auto-descriptifs
Formats avec le suffixe -WithNamesAndTypes
Formats JSON avec métadonnées
Avro
Les autres types Avro ne sont pas pris en charge.
Parquet
Les autres types Parquet ne sont pas pris en charge.
Arrow
Les autres types Arrow ne sont pas pris en charge.
ORC
Les autres types ORC ne sont pas pris en charge.
Native
Formats avec schéma externe
Protobuf
CapnProto
Formats binaires fortement typés
input_format_max_rows_to_read_for_schema_inference lignes ou input_format_max_bytes_to_read_for_schema_inference octets) et extrait
le type (et éventuellement le nom) de chaque valeur à partir des données, puis convertit ces types en types ClickHouse.
MsgPack
input_format_msgpack_number_of_columns. ClickHouse utilise les correspondances de types suivantes :
Par défaut, tous les types inférés sont encapsulés dans
Nullable, mais ce comportement peut être modifié à l’aide du paramètre schema_inference_make_columns_nullable.
BSONEachRow
Par défaut, tous les types inférés sont dans
Nullable, mais ce comportement peut être modifié à l’aide du paramètre schema_inference_make_columns_nullable.
Formats à schéma constant
LineAsString
String. Le type inféré pour ce format est toujours String et le nom de la colonne est line.
Exemple
JSONAsString
String. Le type inféré pour ce format est toujours String, et le nom de la colonne est json.
Exemple
JSONAsObject
JSON. Pour ce format, le type inféré est toujours JSON et le nom de la colonne est json.
Exemple
Modes d’inférence de schéma
default et union.
Le mode est contrôlé par le paramètre schema_inference_mode.
Mode par défaut
data1.jsonl, data2.jsonl et data3.jsonl avec le contenu suivant :
data1.jsonl:
data2.jsonl :
data3.jsonl:
Query
Response
field3 du fichier data3.jsonl.
Cela s’explique par le fait que ClickHouse a d’abord tenté d’inférer le schéma à partir du fichier data1.jsonl, mais a échoué car le champ field2 ne contenait que des valeurs NULL,
puis a tenté d’inférer le schéma à partir de data2.jsonl et a réussi ; les données du fichier data3.jsonl n’ont donc pas été lues.
Mode union
data1.jsonl, data2.jsonl et data3.jsonl avec le contenu suivant :
data1.jsonl:
data2.jsonl:
data3.jsonl:
Query
Response
- Comme certains fichiers peuvent ne pas contenir certaines colonnes du schéma résultant, le mode union est pris en charge uniquement pour les formats qui permettent la lecture d’un sous-ensemble de colonnes (comme JSONEachRow, Parquet, TSVWithNames, etc.) et ne fonctionnera pas avec les autres formats (comme CSV, TSV, JSONCompactEachRow, etc.).
- Si ClickHouse ne parvient pas à inférer le schéma de l’un des fichiers, une exception sera levée.
- Si vous avez beaucoup de fichiers, la lecture du schéma de chacun d’eux peut prendre beaucoup de temps.
Détection automatique du format
data contienne les éléments suivants :
ClickHouse ne peut détecter qu’un nombre limité de formats, et cette détection prend un certain temps. Il est donc toujours préférable de spécifier explicitement le format.