Parquet, CSV

CSV
Parquet
Les Formats de Stockage
Author

Ludovic Deneuville

https://www.icem7.fr/outils/parquet-devrait-remplacer-le-format-csv/ https://www.datacamp.com/fr/tutorial/apache-parquet https://www.snowflake.com/fr/fundamentals/parquet/

Lecture/Ecriture Compression Chargement en mémoire Métadonnées Usages à l’INSEE, Big Data…

Logiciel Tad pour lire fichier

Introduction

Il existe de multiples façon de stocker de la données. Nous verrons ici :

  • CSV : format texte simple, universel et lisible par l’humain
  • Parquet : optimisé et efficace pour les opérations sur les colonnes

1 CSV

CSV signifie Comma-Separated Values ➡️ Valeurs séparées par des virgules.

C’est un format de fichier texte très simple utilisé pour stocker des données tabulaires

  • Chaque ligne du fichier correspond à une ligne du tableau.
  • Chaque colonne est séparée par un caractère spécial (le délimiteur).

Avantages : Léger, universel, lisible par n’importe quel éditeur de texte.

Caution

En France, le délimiteur de colonnes par défaut n’est pas la virgule mais le point-virgule ;.

Mais il arrive de trouver des fichiers csv dont le délimiteur est une virgule , une tabulation \t, un pipe | ou autres.

1.1 Exemples

1.2 Charger un CSV en R

En R, nous utilisons soit la fonction de base (read.csv2), soit le package readr (plus moderne et rapide), soit data.table (pour les très gros fichiers).

Important
  • Avant de charger un fichier : ouvrez-le avec un éditeur de texte pour vérifier le délimiteur !!!
  • Après chargement : vérifiez que les colonnes (et leurs types) de votre dataframe sont cohérentes

1.2.1 R base

df <- read.csv("data.csv")           # Lecture standard (délimiteur virgule)

df <- read.csv2("data.csv")          # Lecture avec point-virgule (format européen courant) 

# Options manuelles
df <- read.csv2("data.csv", 
                sep = ";",                # Délimiteur
                dec = ",",                # Séparateur de décimales
                header = TRUE,            # La première ligne contient les noms de colonnes
                stringsAsFactors = FALSE, # Empêcher la conversion auto en factors
                encoding = "UTF8")        # Encodage du fichier

1.2.2 Avec readr

library(readr)

df <- read_csv("data.csv")
df2 <- read_delim("data.csv", delim = ";")

1.3 Charger un CSV en Python

1.3.1 Avec le module natif csv

Utile pour des scripts très légers où l’on ne veut pas installer Pandas.

import csv

with open('data.csv', mode='r', encoding='utf-8') as f:
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        print(row)

1.3.2 Avec Pandas

import pandas as pd

# Lecture standard (virgule)
df = pd.read_csv('data.csv')

# Options courantes
df = pd.read_csv('data.csv', 
                 sep=';',            # Délimiteur
                 header=0,           # Utiliser la ligne 0 comme en-tête
                 index_col='id',     # Définir une colonne comme index
                 usecols=['A', 'B'], # Ne charger que certaines colonnes
                 encoding='utf-8',   # Gérer l'encodage
                 nrows=100)          # Lire seulement les 100 premières lignes

2 Parquet

Parquet est un format de stockage de données orienté colonne : les valeurs sont stockées colonne par colonne.

Ce n’est pas un format que l’on “écrit” à la main, mais un format que l’on génère via des outils de programmation (Python/Pandas, R, Spark, SQL).

L’avantage majeur : Si vous avez un dataset de 100 colonnes mais que votre analyse ne porte que sur la colonne Age, un moteur de lecture (comme Pandas ou Spark) ne lira que les octets correspondant à la colonne Age. En CSV, vous seriez obligé de lire tout le fichier.

2.1 Pourquoi utiliser Parquet ?

Contrairement aux formats orientés lignes (CSV, JSON), Parquet est conçu pour les charges de travail analytiques (OLAP) où l’on lit rarement toute la table, mais seulement quelques colonnes.

Stocker les données par colonne permet :

  • de ne lire que les colonnes utiles lors d’une requête (column pruning),
  • d’appliquer des algorithmes de compression adaptés aux valeurs similaires,
  • d’activer l’exécution vectorisée (SIMD) dans les moteurs modernes.

2.2 Comment est-il construit ?

Parquet est un format binaire structuré hiérarchiquement :

Niveau Rôle
File Contient le schéma et les métadonnées en début/fin de fichier
Row Group Bloc logique (~128 Mo à 1 Go) représentant un sous-ensemble de lignes
Column Données d’une même colonne stockées séquentiellement dans un Row Group
Page Unité atomique de lecture/compression, contenant valeurs + en-têtes d’encodage

Chaque colonne utilise des encodages spécialisés (Dictionary, RLE, Delta, ByteStreamSplit) puis une compression par page (Snappy, GZIP, ZSTD). Les métadonnées incluent automatiquement les statistiques par Row Group (min, max, null count), permettant des optimisations comme le predicate pushdown.

2.3 Utilisation typique

  • Data Lakes : format natif de référence pour S3, ADLS, GCS
  • Moteurs de calcul : Apache Spark, DuckDB, Pandas (pyarrow), Dask, Polars
  • Couches de table moderne : Apache Iceberg, Delta Lake, Hudi (utilisent Parquet comme format physique)
  • BI & Analytics : connexion native dans Tableau, Power BI, Metabase, Superset

2.4 Avantages & Inconvénients

✅ Avantages ❌ Inconvénients
📉 Compression 5 à 10x supérieure au CSV 🔒 Écrase difficilement une ligne (design append-only)
⚡ Lectures analytiques accélérées (vectorisées) 🐢 Pas adapté à la lecture/écriture en mode transactionnel
📐 Schéma strict & auto-descriptif 🧩 Requiert des bibliothèques compatibles (PyArrow, Parquet-cpp, etc.)
🌐 Interopérable (Python, R, Java, Scala, SQL…) 📦 Fichier monolithique : difficile à modifier partiellement