table.inspect metadata tables silently drop (or misattribute) partition values after a partition field rename
Los mantenedores suelen responder en 1 día
Evaluación
Este issue todavía no se ha evaluado.
Descripción
Apache Iceberg version
main (development)
Please describe the bug 🐞
Describe the bug
When a table evolves its partition spec by renaming a partition field:
TableMetadata.specs_struct()adopts the latest field name for that partitionfield_id(e.g.1000: p->1000: p_renamed).- However,
table.inspect.partitions(),files(),data_files(),all_files(),all_data_files(), andentries()build partition dictionaries usingfield.namefrom each file's historicalPartitionSpecdirectly ({"p": "a"}). - When PyArrow converts these rows to the schema defined by
specs_struct()(which has field"p_renamed"), the"p"key is ignored and"p_renamed"is filled withNone. All pre-rename partition values are silently replaced withNone({'p_renamed': None}).
Similarly, on format-version 1 tables, removing a partition field (remove_field("p")) and subsequently re-adding it (add_identity("p")) automatically renames the voided field (1000: p_1000) and creates 1001: p. Because inspect keys by historical field.name == "p", historical spec 0 data files written under field_id=1000 are silently misattributed to field_id=1001 ({'p_1000': None, 'p': 'a'}).
To Reproduce
import tempfile
import pyarrow as pa
from pyiceberg.catalog.memory import InMemoryCatalog
from pyiceberg.partitioning import PartitionField, PartitionSpec
from pyiceberg.schema import Schema
from pyiceberg.transforms import IdentityTransform
from pyiceberg.types import LongType, NestedField, StringType
with tempfile.TemporaryDirectory() as tmp:
cat = InMemoryCatalog("local", warehouse=f"file://{tmp}/wh")
cat.create_namespace("ns")
tbl = cat.create_table(
"ns.t_rename",
schema=Schema(NestedField(1, "id", LongType()), NestedField(2, "p", StringType())),
partition_spec=PartitionSpec(PartitionField(2, 1000, IdentityTransform(), "p")),
properties={"format-version": "2"},
)
tbl.append(pa.table({"id": [1, 2], "p": ["a", "b"]}))
tbl.update_spec().rename_field("p", "p_renamed").commit()
tbl.append(pa.table({"id": [3], "p": ["c"]}))
# Historical values 'a' and 'b' silently become None:
print(tbl.inspect.partitions().to_pydict()["partition"])
# Current output: [{'p_renamed': 'c'}, {'p_renamed': None}, {'p_renamed': None}]
# Expected output: [{'p_renamed': 'c'}, {'p_renamed': 'a'}, {'p_renamed': 'b'}]
print([r["partition"] for r in tbl.inspect.files().to_pylist()])
# Current output: [{'p_renamed': 'c'}, {'p_renamed': None}, {'p_renamed': None}]
# Expected output: [{'p_renamed': 'c'}, {'p_renamed': 'a'}, {'p_renamed': 'b'}]
Expected behavior
table.inspect tables should map partition field values using the canonical field names from specs_struct() based on field_id, preserving historical partition values across spec renames and correctly separating partition entries per specification layout.
Willingness to contribute
- I can contribute a fix for this bug independently
- I would be willing to contribute a fix for this bug with guidance from the Iceberg community
- I cannot contribute a fix for this bug at this time
- Lenguaje dominante
- Python
- Estrellas
- 1.2k
- Forks
- 654
- Merge medio
- 2 d 11 h
- PR fusionados (30 d)
- 122
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Sin guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de apache/iceberg-python
-
`inspect.files()` and the other file metadata tables raise `ArrowInvalid` when a snapshot has no manifestsPosiblemente ocupada @YuangGao la tomó hace 10 días. Abiertokind:bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
apache/iceberg-python#4269 ·
Los mantenedores suelen responder en 1 día
-
`inspect.entries()` raises TypeError when a data file has no column_sizesPosiblemente ocupada @Rahul-cs50 la tomó hace 14 días. Abiertokind:bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
apache/iceberg-python#4186 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
`older_than` reads a naive datetime as UTC and expires snapshots it should keepPosiblemente ocupada @Rahul-cs50 la tomó hace 13 días. Abiertokind:bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
apache/iceberg-python#4182 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
REST: Send empty first-page pageToken when rest-page-size is setPosiblemente ocupada @ehddnr301 la tomó hace 32 días. Abiertokind:bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
apache/iceberg-python#4096 ·
Los mantenedores suelen responder en 1 día
-
PyArrowFileIO: every small S3 write is a 3-request multipart upload; expose allow_delayed_openPosiblemente ocupada @David-Banquet la tomó hace 29 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
apache/iceberg-python#4093 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de apache/iceberg-python
Issues similares
-
Unknown stop ID in slow zone data crashes post formatting and skips the rest of that day's postsAbiertobackend bug tm-new-volunteer
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
transitmatters/mbta-slow-zone-bot#81 · 1 comentario ·
-
area:schema documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
risk:high type:ci
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 64/100
spacetelescope/rdmt-spire#49 ·
Los mantenedores suelen responder en 1 día