Description
Apache Parquet est un format de stockage colonnaire largement répandu dans l’écosystème Hadoop. ClickHouse prend en charge la lecture et l’écriture de ce format.Correspondance des types de données
Le tableau ci-dessous indique la correspondance entre les types de données Parquet et les types de données de ClickHouse.
Lors de l’écriture d’un fichier Parquet, les types de données qui n’ont pas de type Parquet correspondant sont convertis vers le type disponible le plus proche :
Les tableaux peuvent être imbriqués et accepter comme argument une valeur de type
Nullable. Les types Tuple et Map peuvent également être imbriqués.
Entiers larges
Par défaut, ClickHouse écritInt128, UInt128, Int256 et UInt256 comme valeurs FIXED_LEN_BYTE_ARRAY(16/32) non annotées en ordre little-endian. Cette représentation héritée reste la valeur par défaut afin que les fichiers puissent être lus par les anciennes versions de ClickHouse.
Définissez output_format_parquet_wide_integer_as_decimal = 1 pour utiliser à la place la représentation DECIMAL standard de Parquet :
La représentation décimale fournit un ordre numérique pour les statistiques standard des fragments de colonnes et les index de pages Parquet, ce qui permet à ClickHouse d’utiliser l’élagage min/max des groupes de lignes et des pages. ClickHouse lit les deux encodages. Pour une précision décimale de 39, l’inférence de schéma renvoie
Decimal(39, 0), basé sur Decimal256 ; spécifiez une structure Int128 ou UInt128 explicite pour retrouver un type d’entier large. Une précision décimale de 77 ou 78 dépasse la plage de Decimal256 de ClickHouse ; la lecture de ces fichiers nécessite donc une structure Int256 ou UInt256 compatible explicite. Avec une structure d’entier large explicite, ClickHouse accepte les valeurs décimales standard stockées sous forme de BYTE_ARRAY ou de FIXED_LEN_BYTE_ARRAY de toute largeur valide, et vérifie que chaque valeur est dans la plage après suppression de l’extension de signe.
Certains clients Parquet ne prennent en charge qu’une précision décimale allant jusqu’à 38, tandis que les types décimaux de haut niveau d’Arrow ne prennent en charge qu’une précision allant jusqu’à 76. Ces clients peuvent rejeter la représentation de précision 77/78, même si son schéma et sa largeur physique de 33 octets sont conformes à Parquet. Laissez ce paramètre désactivé lorsque les fichiers doivent être lus par des versions plus anciennes de ClickHouse ou par des clients ayant des limites décimales inférieures.
Les types de données des colonnes d’une table ClickHouse peuvent différer de ceux des champs correspondants dans les données Parquet insérées. Lors de l’insertion de données, ClickHouse interprète les types de données conformément au tableau ci-dessus, puis convertit les données vers le type défini pour la colonne de la table ClickHouse. Par exemple, une colonne Parquet UINT_32 peut être lue dans une colonne ClickHouse IPv4.
Pour certains types Parquet, il n’existe pas de type ClickHouse vraiment proche. Nous les lisons comme suit :
TIMESTAMPavecisAdjustedToUTC=falsecorrespond à une heure locale d’horloge (champs année, mois, jour, heure, minute, seconde et fraction de seconde dans un fuseau horaire local, indépendamment du fuseau horaire précis considéré comme local), comme en SQLTIMESTAMP WITHOUT TIME ZONE. ClickHouse le lit au contraire comme s’il s’agissait d’un timestamp UTC. Par exemple,2025-09-29 18:42:13.000(représentant la lecture d’une horloge locale) devient2025-09-29 18:42:13.000(DateTime64(3, 'UTC')représentant un point dans le temps). S’il est converti en String, il affiche correctement l’année, le mois, le jour, l’heure, la minute, la seconde et la fraction de seconde, qui peuvent ensuite être interprétés comme appartenant à un fuseau horaire local plutôt qu’à UTC. De manière contre-intuitive, changer le type deDateTime64(3, 'UTC')enDateTime64(3)ne résoudrait pas le problème, car les deux types représentent un point dans le temps plutôt qu’une lecture d’horloge, maisDateTime64(3)serait formaté de manière incorrecte avec le fuseau horaire local.INTERVALest actuellement lu commeFixedString(12), avec la représentation binaire brute de l’intervalle de temps telle qu’elle est encodée dans le fichier Parquet.
Types géo (GeoParquet)
ClickHouse prend en charge la lecture et l’écriture des colonnes géométriques conformément à la spécification GeoParquet. Les colonnes géométriques sont stockées sous forme de payloadsBYTE_ARRAY encodés en WKB (ou en WKT à la lecture), avec une clé JSON geo dans les métadonnées Parquet au niveau du fichier, qui décrit l’encodage, le type de géométrie et le CRS de chaque colonne géométrique.
Comportement en lecture
À la lecture, les colonnes géométriques sont associées aux types de données Geo ClickHouse correspondants :- Une colonne déclarée comme
Point,MultiPoint,LineString,Polygon,MultiLineStringouMultiPolygonest lue dans le type Geo ClickHouse correspondant. - Une colonne contenant plusieurs types de géométrie ou des types de géométrie inconnus est lue dans le type
Geometry, qui est unVariantde tous les types Geo pris en charge. - Si le type de colonne demandé est
String, les métadonnées GeoParquet sont ignorées et la charge utile géométrique brute encodée est renvoyée telle quelle — en octets WKB ou WKT, selon l’encodage déclaré par la colonne GeoParquet. Cela vaut également si le paramètreinput_format_parquet_allow_geoparquet_parserest défini sur0.
Comportement d’écriture
Lors de l’écriture, les colonnes de premier niveau de typePoint, MultiPoint, LineString, Polygon, MultiLineString ou MultiPolygon sont encodées en BYTE_ARRAY (WKB), et les métadonnées JSON geo appropriées sont ajoutées au footer du fichier Parquet. Un Geometry Variant de premier niveau est lui aussi encodé sous la forme d’une charge utile BYTE_ARRAY WKB (ses sous-valeurs sont converties en WKB et stockées dans une colonne Nullable(String)), mais aucune métadonnée geo n’est émise le concernant ; le résultat n’est donc pas reconnu à la lecture comme une colonne de géométrie GeoParquet. Les autres types liés à la géométrie, tels que Ring, sont écrits à l’aide de leur représentation native sous-jacente, sans métadonnées GeoParquet. Ce comportement peut être entièrement désactivé en définissant output_format_parquet_geometadata sur 0. Dans ce cas, même les types geo pris en charge sont écrits à l’aide de leur représentation native sous-jacente (Point comme Tuple(Float64, Float64), LineString comme Array(Point), Polygon comme Array(Array(Point)), etc.), et aucune métadonnée GeoParquet n’est émise.
Les colonnes géométriques doivent se trouver à la racine du schéma ou être imbriquées dans Tuple (struct) ; leur imbrication dans Array ou Map n’est pas prise en charge. Nullable n’est pas non plus pris en charge pour les colonnes géométriques.
Exemple d’utilisation
Insertion de données
À partir d’un fichier Parquet contenant les données suivantes, nomméfootball.parquet :
Lecture des données
Lisez les données au formatParquet :
moteur de table HDFS.