Expose per-file write metadata from DataFrame.write_parquet()
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 48/100
- Type d'issue
- Fonctionnalité
- Clarté
- Plutôt claire
- Activité
- Calme
- Domaine
- backend-api-design, data-engineering
Piste de recherche
Commencez par vérifier si apache/datafusion#23656 a été intégré, puis lisez le binding Python de DataFrame.write_parquet() ainsi que l’issue et la pull request Rust core associées. La forme de l’API est encore ouverte : l’issue suggère de retourner les métadonnées directement ou via un WriteResult. Le travail est considéré comme terminé lorsque les bindings exposent les chemins par fichier, les nombres de lignes et les tailles en octets ; les métadonnées sérialisées sont facultatives.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Is your feature request related to a problem or challenge?
DataFrame.write_parquet() currently returns None. After writing, there is no way to retrieve per-file metadata (row counts, byte sizes, column statistics) for the files that were produced. This forces consumers that need file-level statistics — such as Apache Iceberg, Delta Lake, and Apache Hudi — to either:
- Re-read Parquet footers from object storage after writing (extra I/O round-trips)
- Bypass DataFusion's write pipeline entirely and use PyArrow's
ParquetWriterwithmetadata_collector
This is a blocker for building a complete DataFusion-based write backend for table formats that require per-file column statistics in their commit metadata (e.g., Iceberg's DataFile entries need column_sizes, null_counts, lower_bounds, upper_bounds, split_offsets).
Describe the solution you'd like
After apache/datafusion#23472 / apache/datafusion#23656 lands in the Rust core, ParquetSink will expose a file_metadata() method returning per-file path, row count, and byte size. The Python bindings should surface this:
# Option A: write_parquet returns metadata directly
metadata = df.write_parquet("/path/to/output/")
# metadata: list[dict] = [
# {"path": "part-0.parquet", "row_count": 500, "byte_size": 4096},
# {"path": "part-1.parquet", "row_count": 500, "byte_size": 3840},
# ]
# Option B: write_parquet returns a WriteResult object
result = df.write_parquet("/path/to/output/")
result.count # 1000
result.file_metadata # list of per-file metadata dicts
At minimum, each file metadata entry should include:
path(str): Object-store path of the written filerow_count(int): Number of rows in this filebyte_size(int): Sum of compressed row group sizes
Optionally (for full table-format integration):
metadata(bytes | None): Serialized ParquetFileMetaData(Thrift compact), enabling consumers to extract column statistics without re-reading the file
Describe alternatives you've considered
- Return just the count (status quo): Insufficient for table format integration.
- Expose via a separate accessor: e.g.
ctx.last_write_metadata()— awkward API, not composable. - Return raw bytes of the full Parquet footer: Maximally informative but heavier. A structured dict with optional raw bytes is more ergonomic.
Additional context
- Upstream dependency: apache/datafusion#23656 adds
DataSink::file_metadata()to the Rust core. This issue tracks exposing it through the Python bindings. - Motivation: PyIceberg is building a pluggable execution backend with DataFusion for bounded-memory operations. A DataFusion write backend would enable single-pass Copy-on-Write deletes (read → filter → write entirely in Rust with spill-to-disk), but requires per-file metadata to construct Iceberg
DataFilecommit entries. - Related: #1624 (per-session object store config) is the other piece needed for a complete DataFusion write backend in PyIceberg.
- Langage dominant
- Python
- Étoiles
- 605
- Forks
- 176
- Merge moyen
- 1 j 23 h
- PR mergées (30 j)
- 8
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/datafusion-python
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
apache/datafusion-python#1757 ·
-
documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
apache/datafusion-python#1726 ·
-
Difficulté 2/5 Une demi-journée Accessibilité débutants 88/100
apache/datafusion-python#1691 ·
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/datafusion-python#1644 ·
-
enhancement
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 30/100
apache/datafusion-python#1737 ·
Toutes les issues de apache/datafusion-python
Issues similaires
-
bug confirmed issue
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
open-webui/open-webui#30750 · 1 commentaire ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
OpenwaterHealth/openmotion-bloodflow-app#604 · 1 commentaire ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
-
good first issue
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100