Exemple
Créer une table
Paramètres du moteur
path— URL du bucket avec le chemin du fichier. Prend en charge les caractères génériques suivants en modereadonly:*,**,?,{abc,def}et{N..M}, oùNetMsont des nombres, et'abc','def'des chaînes. Pour plus d’informations, voir ci-dessous.NOSIGN- Si ce mot-clé est fourni à la place des informations d’identification, aucune requête ne sera signée.format— Le format du fichier.aws_access_key_id,aws_secret_access_key- Informations d’identification à long terme pour l’utilisateur du compte AWS. Vous pouvez les utiliser pour authentifier vos requêtes. Ce paramètre est facultatif. Si les informations d’identification ne sont pas spécifiées, elles sont récupérées depuis le fichier de configuration. Pour plus d’informations, voir Using S3 for Data Storage.compression— Type de compression. Valeurs prises en charge :none,gzip/gz,brotli/br,xz/LZMA,zstd/zst. Ce paramètre est facultatif. Par défaut, la compression est détectée automatiquement à partir de l’extension du fichier.partition_strategy– Options :WILDCARDouHIVE.WILDCARDnécessite un{_partition_id}dans le chemin, qui est remplacé par la clé de partition.HIVEn’autorise pas les caractères génériques, suppose que le chemin correspond à la racine de la table et génère des répertoires partitionnés au format Hive avec des Snowflake IDs comme noms de fichiers et le format de fichier comme extension. La valeur par défaut est définie par le paramètrefile_like_engine_default_partition_strategy(WILDCARDpour les paramètrescompatibilityantérieurs à26.6,HIVEsinon).partition_columns_in_data_file- Utilisé uniquement avec la stratégie de partitionnementHIVE. Indique à ClickHouse s’il doit s’attendre à ce que les colonnes de partition soient écrites dans le fichier de données. La valeur par défaut estfalse.storage_class_name- Options :STANDARDouINTELLIGENT_TIERING, permet de spécifier AWS S3 Intelligent Tiering.extra_credentials- Facultatif. Utilisé pour transmettre unrole_arnpour l’accès basé sur les rôles dans ClickHouse Cloud. Voir Secure S3 pour les étapes de configuration.
Cache de données
S3 prend en charge la mise en cache des données sur le disque local.
Consultez les options de configuration et l’utilisation du cache du système de fichiers dans cette section.
La mise en cache s’effectue en fonction du chemin et de l’ETag de l’objet de stockage, afin que ClickHouse ne lise pas une version périmée du cache.
Pour activer la mise en cache, utilisez les paramètres filesystem_cache_name = '<name>' et enable_filesystem_cache = 1.
- Ajoutez la section suivante au fichier de configuration de ClickHouse :
- réutiliser la configuration du cache (et donc son stockage) de la section
storage_configurationde ClickHouse, décrite ici
PARTITION BY
PARTITION BY — Facultatif. Dans la plupart des cas, vous n’avez pas besoin de clé de partition et, si vous en avez besoin, il n’est généralement pas nécessaire qu’elle soit plus fine qu’un partitionnement mensuel. Le partitionnement n’accélère pas les requêtes (contrairement à l’expression ORDER BY). N’utilisez jamais un partitionnement trop fin. Ne partitionnez pas vos données par identifiant ou nom de client (à la place, faites de l’identifiant ou du nom du client la première colonne de l’expression ORDER BY).
Pour un partitionnement mensuel, utilisez l’expression toYYYYMM(date_column), où date_column est une colonne contenant une date de type Date. Les noms de partition ont alors le format "YYYYMM".
Stratégie de partitionnement
WILDCARD : remplace le caractère générique {_partition_id} dans le chemin de fichier par la clé de partition réelle. La lecture n’est pas prise en charge. Cette stratégie est 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 en lecture et en écriture. La lecture s’appuie sur un motif glob récursif et équivaut à SELECT * FROM s3('table_root/**.parquet').
L’écriture génère des fichiers au format suivant : <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>.
Remarque : lors de l’utilisation de la stratégie de partitionnement HIVE, le paramètre use_hive_partitioning n’a aucun effet.
Exemple de stratégie de partitionnement HIVE :
Interroger des données partitionnées
ENGINE utilise le jeton de paramètre {_partition_id} comme partie de l’objet S3 (nom de fichier), et que les requêtes SELECT portent sur les noms d’objet ainsi générés (par exemple, test_3.csv).
Comme le montre l’exemple, l’interrogation de tables S3 partitionnées
n’est pas directement prise en charge pour le moment, mais peut être réalisée en interrogeant les partitions individuelles
à l’aide de la fonction de table S3.Le principal cas d’usage de l’écriture de
données partitionnées dans S3 est de permettre le transfert de ces données vers un autre
système ClickHouse (par exemple, lors d’une migration d’un environnement on-prem vers ClickHouse
Cloud). Comme les jeux de données ClickHouse sont souvent très volumineux et que la fiabilité du
réseau n’est pas toujours parfaite, il est logique de transférer les jeux de données
par sous-ensembles, d’où l’intérêt des écritures partitionnées.
Créer la table
Insérer des données
Sélectionner dans la partition 3
Sélectionner dans la partition 1
Sélectionner dans la partition 45
Limitation
Select * from p, mais, comme indiqué ci-dessus, cette requête échouera ; utilisez plutôt la requête précédente.
Insérer des données
s3_truncate_on_insert et s3_create_new_file_on_insert. Voir plus de détails ici.
Colonnes virtuelles
_path— Chemin du fichier. Type :LowCardinality(String)._file— Nom du fichier. Type :LowCardinality(String)._size— Taille du fichier en octets. Type :Nullable(UInt64). Si la taille est inconnue, la valeur estNULL._time— Date et heure de dernière modification du fichier. Type :Nullable(DateTime). Si l’heure est inconnue, la valeur estNULL._etag— ETag du fichier. Type :LowCardinality(String). Si l’ETag est inconnu, la valeur estNULL._tags— Tags du fichier. Type :Map(String, String). S’il n’existe aucun tag, la valeur est une map vide `’.
Détails d’implémentation
- Les lectures et les écritures peuvent s’effectuer en parallèle
- Non pris en charge :
- Les opérations
ALTERetSELECT...SAMPLE. - Les index.
- La réplication zero-copy est possible, mais n’est pas prise en charge.
- Les opérations
La réplication zero-copy n’est pas prête pour un usage en productionLa réplication zero-copy est désactivée par défaut dans ClickHouse version 22.8 et ultérieure. Cette fonctionnalité n’est pas recommandée en production.
Caractères génériques dans le chemin
path peut spécifier plusieurs fichiers à l’aide de caractères génériques de type bash. Pour être traité, un fichier doit exister et correspondre au motif de chemin complet. La liste des fichiers est déterminée lors du SELECT (et non au moment du CREATE).
*— Remplace n’importe quelle suite de caractères, à l’exception de/, y compris la chaîne vide.**— Remplace n’importe quelle suite de caractères, y compris/, y compris la chaîne vide.?— Remplace un seul caractère quelconque.{some_string,another_string,yet_another_one}— Remplace l’une des chaînes'some_string', 'another_string', 'yet_another_one'.{N..M}— Remplace n’importe quel nombre dans l’intervalle de N à M, bornes incluses. N et M peuvent comporter des zéros initiaux, par exemple000..078.
{} sont similaires à la fonction de table remote.
Si la liste des fichiers contient des intervalles numériques avec des zéros initiaux, utilisez la construction avec des accolades pour chaque chiffre séparément ou utilisez
?.file-000.csv, file-001.csv, … , file-999.csv :
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_1.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_2.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_3.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_1.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_2.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_3.csv'
- Indiquez une plage de suffixes de fichiers :
- Prenez tous les fichiers portant le préfixe
some_file_(il ne doit y avoir aucun fichier supplémentaire portant ce préfixe dans les deux dossiers) :
- Prenez tous les fichiers dans les deux dossiers (tous les fichiers doivent respecter le format et le schéma décrits dans la requête) :
Paramètres de stockage
- s3_truncate_on_insert - permet de tronquer le fichier avant d’y effectuer une insertion. 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.
Paramètres liés à S3
s3_max_single_part_upload_size— Taille maximale de l’objet à téléverser vers S3 en une seule partie. La valeur par défaut est32Mb.s3_min_upload_part_size— Taille minimale de la partie à téléverser lors d’un téléversement multipartie vers S3 Multipart upload. La valeur par défaut est16Mb.s3_max_redirects— Nombre maximal de redirections S3 autorisées. La valeur par défaut est10.s3_single_read_retries— Nombre maximal de tentatives pour une lecture unique. La valeur par défaut est4.s3_max_put_rps— Taux maximal de requêtes PUT par seconde avant limitation. La valeur par défaut est0(illimité).s3_max_put_burst— Nombre maximal de requêtes pouvant être émises simultanément avant d’atteindre la limite de requêtes par seconde. Par défaut (valeur0), il est égal às3_max_put_rps.s3_max_get_rps— Taux maximal de requêtes GET par seconde avant limitation. La valeur par défaut est0(illimité).s3_max_get_burst— Nombre maximal de requêtes pouvant être émises simultanément avant d’atteindre la limite de requêtes par seconde. Par défaut (valeur0), il est égal às3_max_get_rps.s3_upload_part_size_multiply_factor- Multiplies3_min_upload_part_sizepar ce facteur chaque fois ques3_multiply_parts_count_thresholdparties ont été téléversées à partir d’une seule écriture vers S3. La valeur par défaut est2.s3_upload_part_size_multiply_parts_count_threshold- Chaque fois que ce nombre de parties a été téléversé vers S3,s3_min_upload_part_sizeest multiplié pars3_upload_part_size_multiply_factor. La valeur par défaut est500.s3_max_inflight_parts_for_one_file- Limite le nombre de requêtes PUT pouvant être exécutées simultanément pour un objet. Cette valeur doit être limitée. La valeur0signifie illimité. La valeur par défaut est20. Chaque partie en cours de transfert utilise un tampon de tailles3_min_upload_part_sizepour less3_upload_part_size_multiply_factorpremières parties, puis davantage lorsque le fichier est suffisamment volumineux, voirupload_part_size_multiply_factor. Avec les paramètres par défaut, un fichier téléversé ne consomme pas plus de320Mbpour un fichier de moins de8G. La consommation est plus élevée pour un fichier plus volumineux.
s3_max_redirects doit être défini sur zéro afin d’éviter les attaques SSRF ; sinon, remote_host_filter doit être spécifié dans la configuration du serveur.
Paramètres propres à l’endpoint
endpoint— Spécifie le préfixe d’un endpoint. Obligatoire.access_key_idetsecret_access_key— Spécifie les identifiants à utiliser avec l’endpoint donné. Facultatif.use_environment_credentials— Si défini surtrue, le client S3 tentera d’obtenir les identifiants à partir des variables d’environnement et des métadonnées Amazon EC2 pour l’endpoint donné. Facultatif, la valeur par défaut estfalse.region— Spécifie le nom de la région S3. Facultatif.use_insecure_imds_request— Si défini surtrue, le client S3 utilisera une requête IMDS non sécurisée lors de l’obtention des identifiants à partir des métadonnées Amazon EC2. Facultatif, la valeur par défaut estfalse.expiration_window_seconds— Période de grâce permettant de vérifier si des identifiants expirables ont expiré. Facultatif, la valeur par défaut est120.no_sign_request- Ignore tous les identifiants afin que les requêtes ne soient pas signées. Utile pour accéder à des buckets publics.header— Ajoute l’en-tête HTTP spécifié à une requête vers l’endpoint donné. Facultatif, peut être spécifié plusieurs fois.access_header- Ajoute l’en-tête HTTP spécifié à une requête vers l’endpoint donné lorsqu’aucun autre identifiant n’est disponible depuis une autre source.server_side_encryption_customer_key_base64— Si spécifié, les en-têtes requis pour accéder à des objets S3 avec un chiffrement SSE-C seront définis. Facultatif.server_side_encryption_kms_key_id- Si spécifié, les en-têtes requis pour accéder à des objets S3 avec le chiffrement SSE-KMS seront définis. Si une chaîne vide est spécifiée, la clé S3 gérée par AWS sera utilisée. Facultatif.server_side_encryption_kms_encryption_context- Si spécifié avecserver_side_encryption_kms_key_id, l’en-tête de contexte de chiffrement fourni pour SSE-KMS sera défini. Facultatif.server_side_encryption_kms_bucket_key_enabled- Si spécifié avecserver_side_encryption_kms_key_id, l’en-tête permettant d’activer les clés de bucket S3 pour SSE-KMS sera défini. Facultatif, peut êtretrueoufalse, et n’a pas de valeur par défaut (correspond au paramètre défini au niveau du bucket).max_single_read_retries— Nombre maximal de tentatives lors d’une lecture unique. La valeur par défaut est4. Facultatif.max_put_rps,max_put_burst,max_get_rpsetmax_get_burst- Paramètres de limitation de débit (voir la description ci-dessus) à utiliser pour un endpoint spécifique plutôt que par query. Facultatif.
Utilisation des archives
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-10.csv.zip'
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-11.csv.zip'
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip'
ClickHouse prend en charge trois formats d’archive :
ZIP
TAR
7Z
Si les archives ZIP et TAR sont accessibles depuis 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é.
Accès aux buckets publics
403.
Vous pouvez éviter ce problème en utilisant le mot-clé NOSIGN, qui force le client à ignorer tous les identifiants et à ne pas signer les requêtes.
Optimisation des performances
Accès basé sur les rôles
roleARN peut être transmis via le paramètre extra_credentials :
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, ce qui permet à la policy de confiance du rôle d’exiger un secret partagé afin d’atténuer le problème du deputy confus :