Passer au contenu principal
Fournit une interface de type table pour sélectionner/insérer des fichiers dans Amazon S3 et Google Cloud Storage. Cette fonction de table est semblable à la fonction hdfs, mais offre des fonctionnalités spécifiques à S3. Si votre cluster comporte plusieurs répliques, vous pouvez utiliser la fonction s3Cluster à la place pour paralléliser les insertions. Lors de l’utilisation de la fonction de table S3 avec INSERT INTO...SELECT, les données sont lues et insérées en flux continu. Seuls quelques blocs de données restent en mémoire pendant que les blocs sont lus en continu depuis S3 et envoyés vers la table de destination.

Syntaxe

GCSLa fonction de table S3 s’intègre à Google Cloud Storage via l’API XML GCS et des clés HMAC. Consultez la documentation sur l’interopérabilité de Google pour plus de détails sur l’endpoint et le HMAC.Pour GCS, remplacez votre clé HMAC et votre secret HMAC là où apparaissent access_key_id et secret_access_key.
Paramètres La fonction de table s3 prend en charge les paramètres simples suivants :
GCSL’URL GCS se présente sous ce format, car l’endpoint de l’API XML de Google est différent de celui de l’API JSON :
et non https://storage.cloud.google.com.
Les arguments peuvent également être transmis à l’aide de collections nommées. Dans ce cas, url, access_key_id, secret_access_key, format, structure et compression_method fonctionnent de la même manière, et certains paramètres supplémentaires sont pris en charge :

Valeur renvoyée

Une table de la structure spécifiée pour lire ou écrire des données dans le fichier spécifié.

Exemples

Sélection des 5 premières lignes de la table issue du fichier S3 https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv :
ClickHouse utilise les extensions de fichier pour déterminer le format des données. Par exemple, nous aurions pu exécuter la commande précédente sans CSVWithNames :
ClickHouse peut également déterminer la méthode de compression d’un fichier. Par exemple, si le fichier était compressé avec une extension .csv.gz, ClickHouse le décompresserait automatiquement.
Les fichiers Parquet dont le nom ressemble à *.parquet.snappy ou *.parquet.zstd peuvent induire ClickHouse en erreur et provoquer des erreurs TOO_LARGE_COMPRESSED_BLOCK ou ZSTD_DECODER_FAILED. En effet, ClickHouse essaierait de lire l’intégralité du fichier comme des données encodées en Snappy ou en ZSTD, alors qu’en réalité, Parquet applique la compression au niveau des groupes de lignes et des colonnes.Les métadonnées Parquet indiquent déjà la compression utilisée pour chaque colonne, l’extension du fichier est donc superflue. Dans ce cas, vous pouvez simplement utiliser compression_method = 'none' :

Utilisation

Supposons que nous ayons plusieurs fichiers avec les URI suivants sur S3 : Compter le nombre de lignes dans les fichiers dont le nom se termine par un chiffre de 1 à 3 :
Compter le nombre total de lignes dans tous les fichiers de ces deux répertoires :
Si votre liste de fichiers contient des plages de nombres avec des zéros non significatifs, utilisez la notation avec des accolades pour chaque chiffre séparément, ou utilisez ?.
Compter le nombre total de lignes dans les fichiers nommés file-000.csv, file-001.csv, … , file-999.csv :
Insérez des données dans le fichier test-data.csv.gz :
Insérez des données dans le fichier test-data.csv.gz à partir d’une table existante :
Le glob ** peut être utilisé pour parcourir les répertoires de manière récursive. Prenons l’exemple ci-dessous : il récupère tous les fichiers du répertoire my-test-bucket-768 de façon récursive :
Ce qui suit récupère les données de tous les fichiers test-data.csv.gz présents dans n’importe quel dossier du répertoire my-test-bucket, de façon récursive :
Note. Il est possible de spécifier des mappeurs d’URL personnalisés dans le fichier de configuration du serveur. Exemple :
L’URL 's3://clickhouse-public-datasets/my-test-bucket-768/**/test-data.csv.gz' serait remplacée par 'http://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**/test-data.csv.gz' Un mappeur personnalisé peut être ajouté au fichier config.xml :
Pour les cas d’utilisation en environnement de production, il est recommandé d’utiliser les collections nommées. Voici un exemple :

Écriture partitionnée

Stratégie de partitionnement

Pris en charge uniquement pour les requêtes INSERT. wildcard : remplace le caractère générique {_partition_id} dans le chemin du fichier par la clé de partition réelle. Sélectionnée par défaut uniquement avec des paramètres compatibility antérieurs à 26.6 ; sinon, la valeur par défaut est hive (voir le paramètre file_like_engine_default_partition_strategy). hive implémente le partitionnement de style Hive pour les lectures et les écritures. Il génère des fichiers au format suivant : <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>. Exemple de stratégie de partitionnement hive
Exemples de la stratégie de partitionnement wildcard
  1. L’utilisation de l’ID de partition dans une clé crée des fichiers distincts :
Par conséquent, les données sont écrites dans trois fichiers : file_x.csv, file_y.csv et file_z.csv.
  1. L’utilisation de l’ID de partition dans le nom d’un bucket crée des fichiers dans différents buckets :
Par conséquent, les données sont enregistrées dans trois fichiers répartis dans différents buckets : my_bucket_1/file.csv, my_bucket_10/file.csv et my_bucket_20/file.csv.

Accès aux buckets publics

ClickHouse tente de récupérer des identifiants à partir de nombreux types de sources. Il peut parfois en résulter des problèmes lors de l’accès à certains buckets publics, le client renvoyant alors le code d’erreur 403. Ce problème peut être évité en utilisant le mot-clé NOSIGN, qui force le client à ignorer tous les identifiants et à ne pas signer les requêtes.

Utilisation des identifiants S3 (ClickHouse Cloud)

Pour les buckets non publics, les utilisateurs peuvent fournir un aws_access_key_id et un aws_secret_access_key à la fonction. Par exemple :
Cela convient pour des accès ponctuels ou lorsque les identifiants peuvent être facilement renouvelés. Cependant, cette approche n’est pas recommandée comme solution à long terme pour des accès répétés ou lorsque les identifiants sont sensibles. Dans ce cas, nous recommandons aux utilisateurs de recourir à un contrôle d’accès basé sur les rôles. Le contrôle d’accès basé sur les rôles pour S3 dans ClickHouse Cloud est documenté ici. Une fois configuré, un roleARN peut être transmis à la fonction s3 via un paramètre extra_credentials. Par exemple :
Un external_id facultatif peut également être fourni avec role_arn. Il est transmis en tant que paramètre ExternalId dans l’appel AWS STS AssumeRole et permet à la stratégie d’approbation du rôle d’exiger un secret partagé, ce qui atténue le problème du deputy confus. Par exemple :
Vous trouverez d’autres exemples ici

Utilisation des archives

Supposons que nous ayons plusieurs fichiers d’archive avec les URI suivantes sur S3 : Il est possible d’extraire des données de ces archives à l’aide de ::. Des globs peuvent être utilisés à la fois dans la partie URL et dans la partie située après :: (qui correspond au nom d’un fichier à l’intérieur de l’archive).
ClickHouse prend en charge trois formats d’archive : ZIP TAR 7Z Si les archives ZIP et TAR sont accessibles à partir de n’importe quel emplacement de stockage pris en charge, les archives 7Z ne peuvent être lues que depuis le système de fichiers local sur lequel ClickHouse est installé.

Insertion de données

Notez que les lignes ne peuvent être insérées que dans de nouveaux fichiers. Il n’y a ni cycles de fusion ni opérations de fractionnement de fichiers. Une fois qu’un fichier a été écrit, les insertions suivantes échoueront. Pour plus de détails, voir ici.

Colonnes virtuelles

  • _path — Chemin du fichier. Type : LowCardinality(String). Dans le cas d’une archive, affiche le chemin au format : "{path_to_archive}::{path_to_file_inside_archive}"
  • _file — Nom du fichier. Type : LowCardinality(String). Dans le cas d’une archive, affiche le nom du fichier contenu dans l’archive.
  • _size — Taille du fichier en octets. Type : Nullable(UInt64). Si la taille du fichier est inconnue, la valeur est NULL. Dans le cas d’une archive, affiche la taille non compressée du fichier contenu dans l’archive.
  • _time — Date et heure de la dernière modification du fichier. Type : Nullable(DateTime). Si cette information est inconnue, la valeur est NULL.

paramètre use_hive_partitioning

Il s’agit d’une indication permettant à ClickHouse d’analyser les fichiers partitionnés au format Hive lors de la lecture. Cela n’a aucun effet sur l’écriture. Pour des lectures et écritures symétriques, utilisez l’argument partition_strategy. Lorsque le paramètre use_hive_partitioning est défini sur 1, ClickHouse détecte le partitionnement au format Hive dans le chemin (/name=value/) et permet d’utiliser les colonnes de partition comme colonnes virtuelles dans la requête. Ces colonnes virtuelles porteront les mêmes noms que dans le chemin partitionné. Exemple

Accéder aux buckets requester-pays

Pour accéder à un bucket requester-pays, l’en-tête x-amz-request-payer = requester doit être transmis avec toutes les requêtes. Pour ce faire, passez le paramètre headers('x-amz-request-payer' = 'requester') à la fonction s3. Par exemple :

Paramètres de stockage

  • s3_truncate_on_insert - permet de tronquer le fichier avant d’y insérer des données. Désactivé par défaut.
  • s3_create_new_file_on_insert - permet de créer un nouveau fichier à chaque insertion si le format comporte un suffixe. Désactivé par défaut.
  • s3_skip_empty_files - permet d’ignorer les fichiers vides lors de la lecture. Activé par défaut.

Schémas Avro imbriqués

Lors de la lecture de fichiers Avro contenant des enregistrements imbriqués dont la structure varie d’un fichier à l’autre (par exemple, si certains fichiers contiennent un champ supplémentaire dans un objet imbriqué), ClickHouse peut renvoyer une erreur du type :
Le nombre de feuilles dans l’enregistrement ne correspond pas au nombre d’éléments du tuple…
Cela se produit parce que ClickHouse s’attend à ce que toutes les structures d’enregistrements imbriqués respectent le même schéma. Pour gérer ce cas, vous pouvez :
  • Utiliser schema_inference_mode='union' pour fusionner différents schémas d’enregistrements imbriqués, ou
  • Aligner manuellement vos structures imbriquées et activer use_structure_from_insertion_table_in_table_functions=1.
Remarque sur les performancesschema_inference_mode='union' peut prendre plus de temps sur de très grands jeux de données S3, car il doit analyser chaque fichier pour inférer le schéma.
Exemple
Dernière modification le 25 juin 2026