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 )

Offen
#3,074 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Type: enhancement
Vorherrschende Sprache
Java
Sterne
3.1k
Forks
1.6k
Ø Merge
3 T. 12 Std.
Gemergte PRs (30 T.)
33

Beschreibung

### 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

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Untersuche in parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java zunächst readFooter() sowie die aktuelle Verarbeitung der Footer-Länge und der Magic-Werte. Überprüfe, dass ein einzelnes readFully(byte[8]) weiterhin sowohl die Verarbeitung des standardmäßigen als auch des verschlüsselten Footer-Magic-Werts gewährleistet, und führe anschließend die relevanten Projekttests aus; abgeschlossen ist die Aufgabe, wenn das Parsen des Footers mit weniger Leseaufrufen korrekt bleibt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java
Bereich
data-engineering
Issue-Typ
Feature
Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
55/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.