Le moteur de table File stocke les données dans un fichier, dans l’un des formats de fichier pris en charge (TabSeparated, Native, etc.).
Scénarios d’utilisation :
- Exporter des données de ClickHouse vers un fichier.
- Convertir des données d’un format à un autre.
- Mettre à jour des données dans ClickHouse en modifiant un fichier sur un disque.
Utilisation dans ClickHouse Server
File(Format)Le paramètre Format spécifie l’un des formats de fichier disponibles. Pour exécuter
des requêtes SELECT, le format doit être pris en charge en entrée, et pour exécuter
des requêtes INSERT, en sortie. Les formats disponibles sont répertoriés dans la
section Formats.
ClickHouse ne permet pas de spécifier un chemin de système de fichiers pour File. Il utilise le dossier défini par le paramètre path dans la configuration du serveur.
Lors de la création d’une table à l’aide de File(Format), un sous-répertoire vide est créé dans ce dossier. Lorsque des données sont écrites dans cette table, elles sont placées dans le fichier data.Format de ce sous-répertoire.
Vous pouvez créer manuellement ce sous-dossier et ce fichier dans le système de fichiers du serveur, puis l’ATTACH aux métadonnées de la table portant le nom correspondant, afin de pouvoir interroger les données de ce fichier.
Exemple
1. Créez la table file_engine_table :
CREATE TABLE file_engine_table (name String, value UInt32) ENGINE=File(TabSeparated)Par défaut, ClickHouse crée le dossier /var/lib/clickhouse/data/default/file_engine_table.
2. Créez manuellement /var/lib/clickhouse/data/default/file_engine_table/data.TabSeparated avec le contenu suivant :
$ cat data.TabSeparated
one 1
two 23. Exécutez une requête sur les données :
SELECT * FROM file_engine_table┌─name─┬─value─┐
│ one │ 1 │
│ two │ 2 │
└──────┴───────┘Utilisation dans ClickHouse-local
Dans clickhouse-local, le moteur File accepte un chemin de fichier en plus de Format. Les flux d’entrée/sortie par défaut peuvent être indiqués à l’aide de noms numériques ou explicites, comme 0 ou stdin, 1 ou stdout. Il est possible de lire et d’écrire des fichiers compressés selon un paramètre supplémentaire du moteur ou l’extension du fichier (gz, br ou xz).
Exemple :
$ echo -e "1,2\n3,4" | clickhouse-local -q "CREATE TABLE table (a Int64, b Int64) ENGINE = File(CSV, stdin); SELECT a, b FROM table; DROP TABLE table"Détails de l’implémentation
- Plusieurs requêtes
SELECTpeuvent être exécutées en parallèle, mais les requêtesINSERTdevront attendre leur tour. - La création d’un nouveau fichier via une requête
INSERTest prise en charge. - Si le fichier existe,
INSERTy ajoutera de nouvelles valeurs, mais uniquement pour les formats qui prennent en charge l’ajout. Les formats qui ne le prennent pas en charge, tels queAvro,Arrow,JSON,Npy,ORCetParquet, rejettent unINSERTdans un fichier non vide avecCANNOT_APPEND_TO_FILE. Pour un chemin de fichier simple, utilisez plutôt les paramètresengine_file_truncate_on_insertouengine_file_allow_create_multiple_filesrépertoriés ci-dessous ; aucun ne s’applique lors de l’écriture via un descripteur de fichier, dont l’appelant est propriétaire. - Non pris en charge :
ALTERSELECT ... SAMPLE- Index
- Réplication
PARTITION BY
PARTITION BY — Facultatif. Il est possible de créer des fichiers distincts en partitionnant les données selon une clé de partition. Dans la plupart des cas, vous n’avez pas besoin de clé de partition et, lorsqu’elle est nécessaire, elle n’a généralement pas besoin d’être plus fine qu’un partitionnement mensuel. Le partitionnement n’accélère pas les requêtes (contrairement à l’expression ORDER BY). Vous ne devez jamais utiliser un partitionnement trop fin. Ne partitionnez pas vos données par identifiant ou nom de client (à la place, utilisez l’identifiant ou le nom du client comme première colonne de l’expression ORDER BY).
Pour un partitionnement par mois, utilisez l’expression toYYYYMM(date_column), où date_column est une colonne contenant une date de type Date. Les noms de partition ont ici le format "YYYYMM".
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— Heure de la dernière modification du fichier. Type :Nullable(DateTime). Si l’heure est inconnue, la valeur estNULL.
Paramètres
- engine_file_empty_if_not_exists - permet de lire des données vides à partir d'un fichier inexistant. Désactivé par défaut.
- engine_file_truncate_on_insert - permet de tronquer le fichier avant d'y insérer des données. Désactivé par défaut.
- engine_file_allow_create_multiple_files - permet de créer un nouveau fichier à chaque insertion si le format comporte un suffixe. Désactivé par défaut.
- engine_file_skip_empty_files - permet d'ignorer les fichiers vides lors de la lecture. Désactivé par défaut.
- storage_file_read_method - méthode de lecture des données depuis le fichier de stockage, parmi :
read,pread,mmap. La méthodemmapne s'applique pas à clickhouse-server (elle est destinée à clickhouse-local). Valeur par défaut :preadpour clickhouse-server,mmappour clickhouse-local.