Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Cache ParsedVersion in FileMetaData to eliminate redundant created_by parsing

Aperta
#3,696 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
55/100
Tipo di issue
Refactoring
Chiarezza
Specificata chiaramente
Stato di attività
Tranquilla
Stack tecnologico
java
Ambito
data

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)
  • ColumnReadStoreImpl constructor accepting ParsedVersion directly

Why This Approach

  • Purely additive: new transient field + getter, no breaking changes
  • Doesn't break serialization: field is transient
  • Follows existing precedent: CorruptDeltaByteArrays already has ParsedVersion-based overloads used from ColumnReaderBase
  • 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:

  1. Adding the ParsedVersion field and getter to FileMetaData
  2. Adding shouldIgnoreStatistics(ParsedVersion, PrimitiveTypeName) overload to CorruptStatistics
  3. Updating ColumnReadStoreImpl to accept ParsedVersion directly
  4. Migrating existing call sites to use the cached version where FileMetaData is 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

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di apache/parquet-java

Tutte le issue di apache/parquet-java

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.