Cache ParsedVersion in FileMetaData to eliminate redundant created_by parsing
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 55/100
Direzione di ricerca
Inizia leggendo FileMetaData, CorruptStatistics e ColumnReadStoreImpl, quindi traccia i siti di chiamata elencati di VersionParser.parse(createdBy) e l’overload ParsedVersion esistente in CorruptDeltaByteArrays. Il lavoro è completato quando FileMetaData espone la versione analizzata memorizzata nella cache, gli overload richiesti esistono e i siti di chiamata accessibili utilizzano il valore memorizzato nella cache senza modificare il comportamento della serializzazione.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
VersionParser.parse(createdBy) is called from 7 distinct production sites, all parsing the same constant string from FileMetaData.getCreatedBy(). Since FileMetaData is constructed once per file and already stores the createdBy string, it is the natural place to parse once and cache.
Problem
The created_by string is re-parsed into a ParsedVersion at every call site independently:
| # | Call site | Frequency per file | When |
|---|---|---|---|
| 1 | CorruptStatistics.shouldIgnoreStatistics via buildColumnChunkMetaData |
R × C | Footer decode |
| 2 | CorruptStatistics.shouldIgnoreStatistics via ParquetFileReader.readAllPages |
Pages per column chunk | Page read |
| 3 | CorruptStatistics.shouldIgnoreStatistics via ParquetRewriter.convertStatistics |
Pages per rewritten chunk | Rewrite |
| 4 | CorruptStatistics.shouldIgnoreStatistics via EncryptedColumnChunkMetaData.decryptIfNeeded |
1 per encrypted column | Lazy decrypt |
| 5 | CorruptDeltaByteArrays.requiresSequentialReads(String, Encoding) in ParquetRecordReader |
1 per reader init | Reader init |
| 6 | ColumnReadStoreImpl constructor via MessageColumnIO.getRecordReader |
R (once per row group read) | Row group materialization |
| 7 | ColumnReadStoreImpl constructor via ParquetRewriter.nullifyColumn |
1 per nullified column | Rewrite with nullification |
ColumnReadStoreImpl already parses createdBy into a ParsedVersion and stores it as a field — but does so R times (once per row group) because nobody upstream caches the parsed result.
Proposed Change
Add a cached ParsedVersion field to FileMetaData:
// In FileMetaData:
private final transient ParsedVersion writerVersion;
public FileMetaData(...) {
...
this.createdBy = createdBy;
this.writerVersion = parseVersion(createdBy);
...
}
public ParsedVersion getWriterVersion() {
return writerVersion;
}
private static ParsedVersion parseVersion(String createdBy) {
if (Strings.isNullOrEmpty(createdBy)) return null;
try {
return VersionParser.parse(createdBy);
} catch (RuntimeException | VersionParseException e) {
return null;
}
}
Then add ParsedVersion-accepting overloads following the existing pattern established by CorruptDeltaByteArrays.requiresSequentialReads(ParsedVersion, Encoding):
CorruptStatistics.shouldIgnoreStatistics(ParsedVersion, PrimitiveTypeName)ColumnReadStoreImplconstructor acceptingParsedVersiondirectly
Why This Approach
- Purely additive: new
transientfield + getter, no breaking changes - Doesn't break serialization: field is
transient - Follows existing precedent:
CorruptDeltaByteArraysalready hasParsedVersion-based overloads used fromColumnReaderBase - Enables incremental adoption: call sites can migrate to the cached version one at a time
- Unblocks #3607: PR #3607 can rebase onto this foundation cleanly using
ParsedVersion-based APIs instead of threading a PARQUET-251-specific boolean
Scope
This issue covers:
- Adding the
ParsedVersionfield and getter toFileMetaData - Adding
shouldIgnoreStatistics(ParsedVersion, PrimitiveTypeName)overload toCorruptStatistics - Updating
ColumnReadStoreImplto acceptParsedVersiondirectly - Migrating existing call sites to use the cached version where
FileMetaDatais accessible
Context
Discussion: https://github.com/apache/parquet-java/pull/3607#issuecomment-5006760055
Related: #3601
- Lingua principale
- Java
- Stelle
- 3.1k
- Fork
- 1.6k
- Merge medio
- 6g 16h
- PR unite (30g)
- 36
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
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/parquet-java
-
Type: bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
apache/parquet-java#3792 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
apache/parquet-java#3767 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
apache/parquet-java#3695 · 1 commento ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
apache/parquet-java#3667 ·
-
Type: bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
apache/parquet-java#3574 · 1 commento ·
Tutte le issue di apache/parquet-java
Issue simili
-
documentation
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
inu-appcenter/memorIN-backend#288 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
-
frontend maui-pilot pilot-ask question
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
executions.Query — startDate and timeRange filters are sent with inverted comparison operators Apertaarea/plugin
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
kestra-io/plugin-kestra#190 ·