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
s3 prend en charge les paramètres simples suivants :
| Paramètre | Description |
|---|---|
url | URL du bucket avec le chemin vers le fichier. Prend en charge les caractères génériques suivants en mode readonly : *, **, ?, {abc,def} et {N..M}, où N, M sont des nombres et 'abc', 'def' des chaînes. Pour plus d’informations, voir ici. |
NOSIGN | Si ce mot-clé est fourni à la place des informations d’identification, aucune des requêtes ne sera signée. |
access_key_id et secret_access_key | Clés qui spécifient les informations d’identification à utiliser avec l’endpoint indiqué. Facultatif. |
session_token | Jeton de session à utiliser avec les clés fournies. Facultatif lorsque des clés sont transmises. |
format | Le format du fichier. |
structure | Structure de la table. Format : 'column1_name column1_type, column2_name column2_type, ...'. |
compression_method | Le paramètre est facultatif. Valeurs prises en charge : none, gzip ou gz, brotli ou br, xz ou LZMA, zstd ou zst. Par défaut, la méthode de compression est détectée automatiquement à partir de l’extension du fichier. |
headers | Le paramètre est facultatif. Permet de transmettre des en-têtes dans la requête S3. Utilisez le format headers(key=value), par exemple headers('x-amz-request-payer' = 'requester'). |
partition_strategy | Le paramètre est facultatif. Valeurs prises en charge : wildcard ou hive. wildcard nécessite un {_partition_id} dans le chemin, qui est remplacé par la clé de partition. hive n’autorise pas les caractères génériques, suppose que le chemin est 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 le paramètre file_like_engine_default_partition_strategy (wildcard dans les paramètres compatibility antérieurs à 26.6, hive sinon). |
partition_columns_in_data_file | Le paramètre est facultatif. Utilisé uniquement avec la stratégie de partition hive. Indique à ClickHouse s’il doit s’attendre à ce que les colonnes de partition soient écrites dans le fichier de données. Valeur par défaut : false. |
extra_credentials | Le paramètre est facultatif. Utilisé pour transmettre un role_arn pour l’accès basé sur les rôles dans ClickHouse Cloud. Consultez Secure S3 pour les étapes de configuration. |
storage_class_name | Le paramètre est facultatif. Valeurs prises en charge : STANDARD ou INTELLIGENT_TIERING. Permet de spécifier AWS S3 Intelligent Tiering. La valeur par défaut est STANDARD. |
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.
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 :
| Argument | Description |
|---|---|
filename | ajouté à l’URL s’il est spécifié. |
use_environment_credentials | activé par défaut, permet de transmettre des paramètres supplémentaires à l’aide des variables d’environnement AWS_CONTAINER_CREDENTIALS_RELATIVE_URI, AWS_CONTAINER_CREDENTIALS_FULL_URI, AWS_CONTAINER_AUTHORIZATION_TOKEN, AWS_EC2_METADATA_DISABLED. |
no_sign_request | désactivé par défaut. |
expiration_window_seconds | la valeur par défaut est de 120. |
Valeur renvoyée
Exemples
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 ClickHouse peut également déterminer la méthode de compression d’un fichier. Par exemple, si le fichier était compressé avec une extension
CSVWithNames :.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
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_4.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_4.csv'
file-000.csv, file-001.csv, … , file-999.csv :
test-data.csv.gz :
test-data.csv.gz à partir d’une table existante :
my-test-bucket-768 de façon récursive :
test-data.csv.gz présents dans n’importe quel dossier du répertoire my-test-bucket, de façon récursive :
'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 :
Écriture partitionnée
Stratégie de partitionnement
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
wildcard
- L’utilisation de l’ID de partition dans une clé crée des fichiers distincts :
file_x.csv, file_y.csv et file_z.csv.
- L’utilisation de l’ID de partition dans le nom d’un bucket crée des fichiers 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
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)
aws_access_key_id et un aws_secret_access_key à la fonction. Par exemple :
roleARN peut être transmis à la fonction s3 via un paramètre extra_credentials. Par exemple :
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 :
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 à 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
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 estNULL. 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 estNULL.
paramètre use_hive_partitioning
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
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
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 performances
schema_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.