apache / apache/parquet-java

read footer using 1 call readFully(byte[8]) instead of 5 calls ( 4 x read() for footer length + 1 x read(byte[4]) for magic marker )

Aperta
#3,074 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Type: enhancement
Lingua principale
Java
Stelle
3.1k
Fork
1.6k
Merge medio
3g 12h
PR unite (30g)
33

Descrizione

### Describe the enhancement requested

This is a minor performance improvement, but worth when reading many files.
read footer using 1 call readFully(byte[8]) instead of 5 calls ( 4 x read() for footer length + 1 x read(byte[4]) for magic marker )

in summary the patch is for file ParquetFileReader.java, method "readFooter()" :

```
--- a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java
+++ b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java
@@ -585,14 +585,18 @@ public class ParquetFileReader implements Closeable {
}

// Read footer length and magic string - with a single seek
- byte[] magic = new byte[MAGIC.length];
- long fileMetadataLengthIndex = fileLen - magic.length - FOOTER_LENGTH_SIZE;
+ long fileMetadataLengthIndex = fileLen - MAGIC.length - FOOTER_LENGTH_SIZE;
LOG.debug("reading footer index at {}", fileMetadataLengthIndex);
f.seek(fileMetadataLengthIndex);
- int fileMetadataLength = readIntLittleEndian(f);
- f.readFully(magic);
+ byte[] magicAndLengthBytes = new byte[FOOTER_LENGTH_SIZE + MAGIC.length];
+ f.readFully(magicAndLengthBytes);
+ int fileMetadataLength = readIntLittleEndian(magicAndLengthBytes, 0);

boolean encryptedFooterMode;
+ // using JDK >= 9: if (Arrays.equals(MAGIC, 0, MAGIC.length, magicAndLengthBytes, FOOTER_LENGTH_SIZE, FOOTER_LENGTH_SIZE + MAGIC.length)) {
+ // using JDK <= 8: need extract sub array then compare
+ byte[] magic = new byte[MAGIC.length];
+ System.arraycopy(magicAndLengthBytes, FOOTER_LENGTH_SIZE, magic, 0, MAGIC.length);
if (Arrays.equals(MAGIC, magic)) {
encryptedFooterMode = false;
} else if (Arrays.equals(EFMAGIC, magic)) {
```

### Component(s)

Core

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

In parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java, esamina prima readFooter() e le letture attuali della lunghezza del footer e dei valori magic. Verifica che una singola readFully(byte[8]) mantenga la gestione sia del magic del footer standard sia del footer crittografato, quindi esegui i test rilevanti del progetto; il lavoro è completato quando il parsing del footer rimane corretto con meno chiamate di lettura.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
java
Ambito
data-engineering
Tipo di issue
Funzionalità
Difficoltà
2/5
Tempo stimato
1-3 ore
Stato di attività
Ferma
Chiarezza
Specificata chiaramente
Idoneità per principianti
55/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.