ClickHouse prend en charge l’importation et l’exportation de données au format CSV. Les fichiers CSV pouvant présenter différentes spécificités de format, comme des lignes d’en-tête, des délimiteurs personnalisés et des caractères d’échappement, ClickHouse propose des formats et des paramètres permettant de traiter efficacement chaque cas.
Importer des données depuis un fichier CSV
Avant d’importer des données, créons une table avec une structure adaptée :
Pour importer des données depuis le fichier CSV vers la table sometable, nous pouvons rediriger notre fichier directement vers clickhouse-client :
Notez que nous utilisons FORMAT CSV pour indiquer à ClickHouse que nous ingérons des données au format CSV. Nous pouvons aussi charger des données depuis un fichier local à l’aide de la clause FROM INFILE :
Ici, nous utilisons la clause FORMAT CSV pour que ClickHouse reconnaisse le format du fichier. Nous pouvons également charger des données directement depuis des URL à l’aide de la fonction url(), ou depuis des fichiers S3 à l’aide de la fonction s3().
Nous pouvons omettre la spécification explicite du format pour file() et INFILE/OUTFILE.
Dans ce cas, ClickHouse détectera automatiquement le format à partir de l’extension du fichier.
Supposons que notre fichier CSV comporte des en-têtes :
Pour importer des données depuis ce fichier, nous pouvons utiliser le format CSVWithNames :
Dans ce cas, ClickHouse ignore la première ligne lors de l’importation des données à partir du fichier.
À partir de la version 23.1, ClickHouse détecte automatiquement les en-têtes dans les fichiers CSV lors de l’utilisation du format CSV. Il n’est donc pas nécessaire d’utiliser CSVWithNames ou CSVWithNamesAndTypes.
Fichiers CSV avec des délimiteurs personnalisés
Si le fichier CSV utilise un délimiteur autre qu’une virgule, vous pouvez utiliser l’option format_csv_delimiter pour définir le symbole correspondant :
Désormais, lors de l’importation depuis un fichier CSV, le symbole ; sera utilisé comme délimiteur à la place de la virgule.
Ignorer des lignes dans un fichier CSV
Il peut parfois être nécessaire d’ignorer un certain nombre de lignes lors de l’importation de données depuis un fichier CSV. Cela peut se faire à l’aide de l’option input_format_csv_skip_first_lines :
Dans ce cas, nous allons ignorer les dix premières lignes du fichier CSV :
Le fichier contient 1k lignes, mais ClickHouse n’en a chargé que 990, car nous avons demandé à ignorer les 10 premières.
Lorsque vous utilisez la fonction file(), avec ClickHouse Cloud, vous devez exécuter les commandes depuis clickhouse client sur la machine où se trouve le fichier. Vous pouvez aussi utiliser clickhouse-local pour explorer les fichiers localement.
Traitement des valeurs NULL dans les fichiers CSV
Les valeurs NULL peuvent être encodées différemment selon l’application qui a généré le fichier. Par défaut, ClickHouse utilise \N comme valeur NULL dans les fichiers CSV. Mais il est possible de modifier ce comportement à l’aide de l’option format_csv_null_representation.
Supposons que nous ayons le fichier CSV suivant :
Si l’on charge des données à partir de ce fichier, ClickHouse traitera Nothing comme une String (ce qui est correct) :
Si nous voulons que ClickHouse traite Nothing comme NULL, nous pouvons le spécifier à l’aide de l’option suivante :
Nous avons maintenant NULL là où nous l’attendons :
Fichiers TSV (séparés par des tabulations)
Le format de données séparées par des tabulations est couramment utilisé comme format d’échange de données. Pour charger des données depuis un fichier TSV dans ClickHouse, on utilise le format TabSeparated :
Il existe également un format TabSeparatedWithNames qui permet de travailler avec des fichiers TSV avec en-têtes. Et, comme pour le CSV, il est possible d’ignorer les X premières lignes à l’aide de l’option input_format_tsv_skip_first_lines.
Il arrive que les fichiers TSV soient enregistrés sans échappement des tabulations ni des retours à la ligne. Il faut utiliser TabSeparatedRaw pour traiter ce type de fichiers.
Tous les formats de nos exemples précédents peuvent également être utilisés pour exporter des données. Pour exporter des données d’une table (ou d’une requête) au format CSV, nous utilisons la même clause FORMAT :
Pour ajouter une ligne d’en-tête au fichier CSV, nous utilisons le format CSVWithNames :
Enregistrer les données exportées dans un fichier CSV
Pour enregistrer les données exportées dans un fichier, vous pouvez utiliser la clause INTO…OUTFILE :
Notez qu’il n’a fallu à ClickHouse qu’~1 seconde pour écrire 36 M de lignes dans un fichier CSV.
Si nous voulons utiliser des délimiteurs autres que la virgule, nous pouvons utiliser l’option de paramètre format_csv_delimiter :
Désormais, ClickHouse utilisera | comme délimiteur pour le format CSV :
Exportation d’un CSV pour Windows
Si vous souhaitez qu’un fichier CSV fonctionne correctement dans un environnement Windows, vous devriez envisager d’activer l’option output_format_csv_crlf_end_of_line. Cela utilisera \r\n comme saut de ligne au lieu de \n :
Inférence de schéma pour les fichiers CSV
Dans de nombreux cas, nous pouvons être amenés à travailler avec des fichiers CSV inconnus ; nous devons donc déterminer quels types utiliser pour les colonnes. ClickHouse, par défaut, essaie de déduire les formats de données à partir de l’analyse d’un fichier CSV donné. Ce processus est appelé “Schema Inference”. Les types de données détectés peuvent être examinés à l’aide de l’instruction DESCRIBE, associée à la fonction file() :
Ici, ClickHouse a pu déduire efficacement les types de colonnes de notre fichier CSV. Si nous ne voulons pas que ClickHouse les déduise, nous pouvons désactiver ce comportement avec l’option suivante :
Tous les types de colonnes seront alors traités comme des String.
Exportation et importation de CSV avec des types de colonnes explicites
ClickHouse permet également de définir explicitement les types de colonnes lors de l’export des données à l’aide de CSVWithNamesAndTypes (ainsi que d’autres formats de la famille WithNames) :
Ce format inclura deux lignes d’en-tête : l’une avec les noms de colonnes et l’autre avec les types de colonnes. Cela permettra à ClickHouse (et à d’autres applications) d’identifier les types de colonnes lors du chargement de données depuis ces fichiers :
Désormais, ClickHouse détermine les types de colonnes à partir d’une (deuxième) ligne d’en-tête, au lieu de les deviner.
Délimiteurs, séparateurs et règles d’échappement personnalisés
Dans les cas les plus complexes, les données textuelles peuvent être formatées de manière très personnalisée tout en conservant une structure. ClickHouse propose un format spécial CustomSeparated pour ce type de cas, qui permet de définir des règles d’échappement, des délimiteurs, des séparateurs de lignes, ainsi que des symboles de début et de fin personnalisés.
Supposons que le fichier contienne les données suivantes :
On voit que chaque ligne est encapsulée dans row(), que les lignes sont séparées par , et que les différentes valeurs sont délimitées par ;. Dans ce cas, nous pouvons utiliser les paramètres suivants pour lire les données de ce fichier :
Nous pouvons maintenant charger des données à partir de notre fichier au format personnalisé :
Nous pouvons également utiliser CustomSeparatedWithNames pour que les en-têtes soient correctement exportés et importés. Découvrez les formats Regex et Template pour gérer des cas encore plus complexes.
Travailler avec de gros fichiers CSV
Les fichiers CSV peuvent être volumineux, et ClickHouse les gère efficacement, quelle que soit leur taille. Les gros fichiers sont généralement compressés, et ClickHouse les prend en charge sans qu’il soit nécessaire de les décompresser avant traitement. Nous pouvons utiliser une clause COMPRESSION lors d’un insert :
Si la clause COMPRESSION est omise, ClickHouse essaiera tout de même de déterminer la compression du fichier à partir de son extension. La même approche peut être utilisée pour exporter directement des fichiers dans des formats compressés :
Cela créera un fichier compressé data_csv.csv.gz.
ClickHouse prend en charge de nombreux formats, textuels comme binaires, afin de répondre à divers scénarios et plateformes. Découvrez d’autres formats et différentes façons de les utiliser dans les articles suivants :
Consultez également clickhouse-local - un outil portable complet pour travailler avec des fichiers locaux ou distants, sans avoir besoin de ClickHouse server.