[Feature] Support shared-shredding storage layout for MAP columns
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
Direzione di ricerca
Inizia con PIP-43 e traccia le interfacce esistenti FormatWriter, FileBatchReader, AppendOnlyWriter, LeafPredicate e PredicateConverter. Mappa i percorsi di scrittura e lettura prima di implementare le parti di conversione dello schema, metadati, allocazione, traduzione dei predicati e ricostruzione. Il lavoro è completo quando le colonne MAP con shared-shredding funzionano durante la scrittura, la lettura, il filtraggio, la gestione dell’overflow e con valori K variabili tra i file.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Search before asking
- I searched in the issues and found nothing similar.
Motivation
In time-series / IoT / observability workloads, a common pattern is storing free-schema fields in a MAP<STRING, T> column (e.g. metrics MAP<STRING, DOUBLE>). The default MAP storage (two KV arrays) provides:
- No per-key columnar access
- No per-key statistics
- No predicate pushdown on individual keys
This makes queries like SELECT ext_map['usage'] FROM metrics WHERE ext_map['usage'] > 30 scan the entire MAP column — extremely inefficient when only 1–3 keys out of thousands are needed per query.
The PIP-43: Columnar Storage Optimization for MAP Type in Paimon proposes a new shared-shredding storage layout that stores MAP values in K reusable physical columns within a Struct, achieving near-full columnar access with per-key statistics and predicate pushdown — without changing the logical type (MAP<STRING, T>).
Solution
Physical Layout
Each MAP<STRING, T> column configured with fields.<column>.map.storage-layout = shared-shredding is physically stored as:
STRUCT<
__field_mapping: FixedSizeList<Int32, K>, -- per-row: which field_id each col holds
__col_0: T, __col_1: T, ..., __col_{K-1}: T, -- reusable typed columns
__overflow: MAP<INT32, T> -- rare fallback for rows with > K fields
>
fields.<column>.map.shared-shredding.max-columns controls K_max, and fields.<column>.map.shared-shredding.column-placement-policy controls column placement.
File metadata (footer) stores: field name↔id dictionary, field_id→physical column set S, overflow set O, K, and max row width.
Write Path
-
Schema conversion utilities — Logical MAP → physical Struct schema rewriting; metadata serialization/deserialization; shared-shredding column detection via field metadata marker.
-
FormatWriter::AddMetadata— New virtual method (default no-op) for writing key-value metadata to file footer beforeFinish(). Parquet implementation callsAddKeyValueMetadata. -
Column allocator — Per-row slot allocator that maps field IDs to up to
Kphysical columns and sends the rest to overflow. Placement policy is configurable (plain,sequential,lru; defaultplain). Accumulates file-level statistics (S, O, max row width). -
Logical→physical batch converter — Parses logical MAP, encodes field names to integer IDs (file-level dictionary), invokes allocator per row, assembles physical Struct array.
-
Writer integration — Extended DataFileWriter that performs conversion before writing + injects metadata on close. AppendOnlyWriter detects shared-shredding columns and routes accordingly. Cross-file K adaptation (P99 of recent max row widths, capped by K_max).
Read Path
-
File metadata parsing — Parse shared-shredding metadata from file footer (dictionary, S, O, K). New
GetFileKeyValueMetadata()method onFileBatchReaderwith Parquet implementation. -
Predicate translation — Translate logical predicates on MAP keys into conservative OR predicates over physical sub-columns. Requires extending
LeafPredicateto support nested field paths and updatingPredicateConverterto emit nestedFieldRef. -
Read planning — At
SetReadSchematime: look up which physical columns to read (from S), decide whether__overflowis needed (from O), translate predicates, and pass the physical schema + physical predicate down to the innerFileBatchReaderunchanged. -
Batch reconstruction — After
NextBatch: read__field_mappingper row to identify which column holds which field (fine-grained filter), gather values into logicalMAP<STRING, T>. Merge overflow when needed. Correctness relies on per-row__field_mapping, not on pushdown precision. -
Reader integration — A wrapper reader (implements
FileBatchReader) sits between the upper layer and the format-level reader. Per-file instance. Compatible with varying K across files. Orthogonal toDataEvolutionFileReader(schema evolution).
Anything else?
No response
Are you willing to submit a PR?
- I'm willing to submit a PR!
- Lingua principale
- C++
- Stelle
- 65
- Fork
- 29
- Merge medio
- 2g 30m
- PR unite (30g)
- 77
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/paimon-cpp
-
enhancement
apache/paimon-cpp#381 · 1 assegnatario ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
apache/paimon-cpp#375 · 1 assegnatario ·
-
enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 30/100
apache/paimon-cpp#369 · 1 assegnatario ·
-
enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 45/100
apache/paimon-cpp#361 · 1 assegnatario ·
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 68/100
apache/paimon-cpp#347 · 1 assegnatario ·
Tutte le issue di apache/paimon-cpp
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
AXERA-TECH/ax-llm#77 ·
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
games-on-whales/wolf#509 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
-
bug-unconfirmed
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
NVIDIA/cuda-samples#453 ·