Parquet est un format de fichier efficace pour stocker les données au format colonnaire. ClickHouse prend en charge aussi bien la lecture que l’écriture de fichiers Parquet.
Importation à partir de Parquet
Avant de charger les données, nous pouvons utiliser la fonction file() pour examiner la structure d’un fichier Parquet d’exemple :
DESCRIBE TABLE file('data.parquet', Parquet);Nous avons utilisé Parquet comme deuxième argument, afin que ClickHouse reconnaisse le format du fichier. Cela affichera les colonnes avec leur type :
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘Nous pouvons également inspecter des fichiers avant d’importer réellement des données, grâce à toute la puissance de SQL :
SELECT *
FROM file('data.parquet', Parquet)
LIMIT 3;┌─path──────────────────────┬─date───────┬─hits─┐
│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │
│ Aegithina_tiphia │ 2018-02-01 │ 34 │
│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │
└───────────────────────────┴────────────┴──────┘Importer dans une table existante
Créons une table dans laquelle nous importerons des données Parquet :
CREATE TABLE sometable
(
`path` String,
`date` Date,
`hits` UInt32
)
ENGINE = MergeTree
ORDER BY (date, path);Nous pouvons maintenant importer des données à l’aide de la clause FROM INFILE :
INSERT INTO sometable
FROM INFILE 'data.parquet' FORMAT Parquet;
SELECT *
FROM sometable
LIMIT 5;┌─path──────────────────────────┬───────date─┬─hits─┐
│ 1988_in_philosophy │ 2015-05-01 │ 70 │
│ 2004_Green_Bay_Packers_season │ 2015-05-01 │ 970 │
│ 24_hours_of_lemans │ 2015-05-01 │ 37 │
│ 25604_Karlin │ 2015-05-01 │ 20 │
│ ASCII_ART │ 2015-05-01 │ 9 │
└───────────────────────────────┴────────────┴──────┘Notez que ClickHouse a automatiquement converti les chaînes Parquet (dans la colonne date) en type Date. Cela s'explique par le fait que ClickHouse effectue automatiquement une conversion de type en fonction des types de la table cible.
Insérer un fichier local dans un serveur distant
Si vous souhaitez insérer un fichier Parquet local dans un serveur ClickHouse distant, vous pouvez le faire en acheminant le contenu du fichier vers clickhouse-client, comme illustré ci-dessous :
clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquetCréation de nouvelles tables à partir de fichiers Parquet
Comme ClickHouse lit le schéma d’un fichier Parquet, nous pouvons créer des tables à la volée :
CREATE TABLE imported_from_parquet
ENGINE = MergeTree
ORDER BY tuple() AS
SELECT *
FROM file('data.parquet', Parquet)Cela créera automatiquement une table et la peuplera à partir d’un fichier Parquet spécifié :
DESCRIBE TABLE imported_from_parquet;┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘Par défaut, ClickHouse applique strictement les noms de colonnes, les types et les valeurs. Mais il est parfois possible d’ignorer des colonnes inexistantes ou des valeurs non prises en charge lors de l’importation. Cela peut être configuré avec les paramètres Parquet.
Exportation au format Parquet
Pour exporter n’importe quelle table ou tout résultat de la requête vers un fichier Parquet, nous pouvons utiliser une clause INTO OUTFILE :
SELECT *
FROM sometable
INTO OUTFILE 'export.parquet'
FORMAT ParquetCela créera le fichier export.parquet dans le répertoire de travail.
Types de données ClickHouse et Parquet
Les types de données ClickHouse et Parquet sont en grande partie identiques, mais présentent tout de même quelques différences. Par exemple, ClickHouse exporte le type DateTime sous la forme d’un int64 Parquet. Si nous le réimportons ensuite dans ClickHouse, nous verrons des nombres (fichier time.parquet) :
SELECT * FROM file('time.parquet', Parquet);┌─n─┬───────time─┐
│ 0 │ 1673622611 │
│ 1 │ 1673622610 │
│ 2 │ 1673622609 │
│ 3 │ 1673622608 │
│ 4 │ 1673622607 │
└───┴────────────┘Dans ce cas, on peut utiliser la conversion de type :
SELECT
n,
toDateTime(time) <--- int to time
FROM file('time.parquet', Parquet);┌─n─┬────toDateTime(time)─┐
│ 0 │ 2023-01-13 15:10:11 │
│ 1 │ 2023-01-13 15:10:10 │
│ 2 │ 2023-01-13 15:10:09 │
│ 3 │ 2023-01-13 15:10:08 │
│ 4 │ 2023-01-13 15:10:07 │
└───┴─────────────────────┘Lectures complémentaires
ClickHouse prend en charge de nombreux formats, aussi bien textuels que binaires, afin de couvrir divers scénarios et plateformes. Découvrez d'autres formats et différentes façons de les utiliser dans les articles suivants :
- Formats CSV et TSV
- Avro, Arrow et ORC
- Formats JSON
- Regex et templates
- Formats natifs et binaires
- Formats SQL
Consultez également clickhouse-local - un outil portable complet pour travailler sur des fichiers locaux/distants sans avoir besoin d'un ClickHouse server.