Pandas Lire les fichiers Parquet / Feather
Parquet et Feather sont deux formats efficaces de stockage de données en colonnes, conçus pour l'analyse de big data et les scénarios de lecture/écriture rapides. Par rapport à CSV, ils offrent un meilleur taux de compression et de meilleures performances de requête.
Pourquoi utiliser Parquet et Feather
Principaux avantages des formats de stockage en colonnes :
| Fonctionnalité | CSV | Parquet | Feather |
|---|---|---|---|
| Format de stockage | En lignes | En colonnes | En colonnes |
| Vitesse de lecture | Lent | Très rapide | Extrêmement rapide |
| Vitesse d'écriture | Moyenne | Rapide | Extrêmement rapide |
| Taux de compression | Faible | Élevée | Moyenne |
| Support multi-langages | Général | Java/Python/R | Python/R |
Parquet est un projet de la fondation Apache, largement utilisé dans l'écosystème du big data (Hadoop, Spark, DuckDB, etc.). Feather est l'implémentation native du projet Arrow, axée sur une vitesse de lecture/écriture ultime.
Opérations sur les fichiers Parquet
Installer les dépendances
pip install pyarrow fastparquet
PyArrow et FastParquet sont tous deux des implémentations Python de Parquet. PyArrow est l'option par défaut, et FastParquet est plus rapide dans certains scénarios.
Lire les fichiers Parquet
Exemple
# Lire un fichier Parquet (utilise pyarrow par défaut)
df = pd.read_parquet("data.parquet")
# Spécifier un moteur spécifique
df = pd.read_parquet("data.parquet", engine="pyarrow")
df = pd.read_parquet("data.parquet", engine="fastparquet")
# Lire un fichier Parquet distant
df = pd.read_parquet("s3://bucket/data.parquet")
# Lire des colonnes spécifiques du fichier (élagage des colonnes, améliore les performances)
df = pd.read_parquet("data.parquet", columns=["name", "age", "city"])
print(df.head())
Écrire des fichiers Parquet
Exemple
# Préparer les données de test
df = pd.DataFrame({
"id": range(1, 10001),
"name": ["User" + str(i) for i in range(1, 10001)],
"age": [20, 25, 30, 35] * 2500,
"city": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen"] * 2500,
"score": [round(i * 0.1, 2) for i in range(1, 10001)]
})
# Écrire un fichier Parquet (utilise le moteur pyarrow par défaut)
df.to_parquet("data.parquet", index=False)
# Spécifier la méthode de compression (snappy rapide, gzip taux de compression élevé)
df.to_parquet("data_snappy.parquet", compression="snappy", index=False)
df.to_parquet("data_gzip.parquet", compression="gzip", index=False)
df.to_parquet("data_none.parquet", compression=None, index=False) # Aucune compression
# Afficher la taille du fichier
import os
print("Comparaison de la taille des fichiers :")
print(f"CSV brut estimé : {len(df) * 50 / 1024 / 1024:.2f} MB")
print(f"compressé snappy : {os.path.getsize('data_snappy.parquet') / 1024 / 1024:.2f} MB")
print(f"compressé gzip : {os.path.getsize('data_gzip.parquet') / 1024 / 1024:.2f} MB")
print(f"Aucune compression : {os.path.getsize('data_none.parquet') / 1024 / 1024:.2f} MB")
Utilisation du moteur FastParquet
Exemple
import time
# Tester les performances d'écriture des différents moteurs
df = pd.DataFrame({
"id": range(1, 100001),
"value": range(1, 100001)
})
# écriture avec le moteur pyarrow
start = time.time()
df.to_parquet("test_pyarrow.parquet", engine="pyarrow", compression="snappy")
print(f"temps d'écriture pyarrow : {time.time() - start:.3f}s")
# écriture avec le moteur fastparquet
start = time.time()
df.to_parquet("test_fastparquet.parquet", engine="fastparquet", compression="snappy")
print(f"temps d'écriture fastparquet : {time.time() - start:.3f}s")
Opérations sur les fichiers Feather
Feather est une implémentation Python du projet Arrow, axée sur la vitesse ultime de lecture/écriture en mémoire.
Installer les dépendances
pip install pyarrow
Lire les fichiers Feather
Exemple
# Lire le fichier Feather
df = pd.read_feather("data.feather")
# Lire la version v2 du fichier Feather (plus universelle)
df = pd.read_feather("data.feather", version="2.0")
# Lire des colonnes spécifiques
df = pd.read_feather("data.feather", columns=["name", "age"])
print(df.head())
Écrire des fichiers Feather
Exemple
# Préparer les données de test
df = pd.DataFrame({
"id": range(1, 10001),
"name": ["User" + str(i) for i in range(1, 10001)],
"value": [round(i * 0.1, 2) for i in range(1, 10001)]
})
# Écrire un fichier Feather
df.to_feather("data.feather")
# Compression LZ4 (plus rapide)
df.to_feather("data_lz4.feather", compression="lz4")
# Compression ZSTD (taux de compression plus élevé)
df.to_feather("data_zstd.feather", compression="zstd")
# Afficher la taille du fichier
import os
print(f"Aucune compression : {os.path.getsize('data.feather') / 1024:.2f} KB")
print(f"LZ4: {os.path.getsize('data_lz4.feather') / 1024:.2f} KB")
print(f"ZSTD: {os.path.getsize('data_zstd.feather') / 1024:.2f} KB")
Test de comparaison des performances
Exemple
import numpy as np
import time
import os
import tempfile
# Créer des données de test
np.random.seed(42)
n_rows = 1000000
df = pd.DataFrame({
"id": range(n_rows),
"category": np.random.choice(["A", "B", "C", "D"], n_rows),
"value": np.random.randn(n_rows),
"flag": np.random.choice([True, False], n_rows),
"date": pd.date_range("2020-01-01", periods=n_rows, freq="1min")
})
# Créer un répertoire temporaire
with tempfile.TemporaryDirectory() as tmpdir:
# Écriture CSV
start = time.time()
df.to_csv(f"{tmpdir}/data.csv", index=False)
csv_write = time.time() - start
start = time.time()
df_csv = pd.read_csv(f"{tmpdir}/data.csv")
csv_read = time.time() - start
# Écriture Parquet
start = time.time()
df.to_parquet(f"{tmpdir}/data.parquet", index=False)
pq_write = time.time() - start
start = time.time()
df_pq = pd.read_parquet(f"{tmpdir}/data.parquet")
pq_read = time.time() - start
# Écriture Feather
start = time.time()
df.to_feather(f"{tmpdir}/data.feather")
feather_write = time.time() - start
start = time.time()
df_feather = pd.read_feather(f"{tmpdir}/data.feather")
feather_read = time.time() - start
# Afficher les résultats
print(f"{'Format':<10} {'Temps d’écriture':<12} {'Temps de lecture':<12} {'Taille du fichier':<12}")
print("-" * 50)
print(f"{'CSV':<10} {csv_write:.3f}s{'':<5} {csv_read:.3f}s{'':<5} {os.path.getsize(f'{tmpdir}/data.csv')/1024/1024:.2f}MB")
print(f"{'Parquet':<10} {pq_write:.3f}s{'':<5} {pq_read:.3f}s{'':<5} {os.path.getsize(f'{tmpdir}/data.parquet')/1024/1024:.2f}MB")
print(f"{'Feather':<10} {feather_write:.3f}s{'':<5} {feather_read:.3f}s{'':<5} {os.path.getsize(f'{tmpdir}/data.feather')/1024/1024:.2f}MB")
Cas d’utilisation et recommandations de sélection
| Scénario | Format recommandé | Raison |
|---|---|---|
| Analyse de Big Data | Parquet | Ratio de compression élevé, requêtes columnaires rapides, écosystème étendu |
| Transfert de données Python/R | Feather | Lecture/écriture extrêmement rapide, prise en charge native d’Arrow |
| Intégration Spark/Hadoop | Parquet | Format standard dans l’écosystème du big data |
| Sauvegarde/archivage des données | Parquet | Fort taux de compression, prend en charge l’évolution du schéma |
| Cache de données temporaire | Feather | Lecture/écriture la plus rapide |
Questions fréquentes
1. Erreur de lecture de Parquet
Assurez-vous que pyarrow ou fastparquet est installé :pip install pyarrow
2. Corruption de fichier
Lors de l’écriture, assurez-vous que les données sont complètement écrites sur le disque. Il est recommandé de vérifier que le fichier est lisible après l’écriture.
3. Compatibilité des versions
Différentes versions de Parquet peuvent avoir des problèmes de compatibilité. Il est recommandé d'utiliser une version fixe dans votre projet.
Autres extensions