
Inhaltsverzeichnis
Man sagt ja heute gerne, dass Daten das Öl der Zukunft ist. Eigentlich waren Daten in der IT schon immer wichtig. Daher ist es wichtig sich mit Daten eingehend auseinanderzusetzen. Da die Datenmengen immer größer werden und immer weiter wachsen, wird die Art und Weise, wie wir Daten speichern und verarbeiten, immer entscheidender. Ein Datenformat, das sich hierbei als äußerst nützlich erweist, ist Parquet. Das Datenformat wird häufig auch von Data Lakes genutzt. Schauen wir uns das Format einmal genauer an.
Was sind Parquet Files?
Parquet ist ein spaltenbasiertes Speicherformat, das initial von Twitter (heute X) entwickelt und später als Open-Source-Projekt unter der Apache-Lizenz weitergeführt wurde. Es ist speziell dafür konzipiert, große Datenmengen effizient zu speichern und eine optimale Leistung beim Datenzugriff (Lesezugriff) zu bieten. Traditionelle zeilenbasierte Formate speichern die Daten vertikal in Zeilen. Parquet organisiert die Daten in einem hybriden Format. Es ist eine Mischung aus horizontaler und vertikeler Speicherung. Das macht es besonders geeignet für massive Datenanalysen und schnelle Abfragen. Die Daten werden horizontal und vertikal partitioniert.
Beispiel: Stell dir eine riesige Tabelle vor, in der jeder Datensatz Informationen über verschiedene Kunden enthält. Wenn du nur die Spalte „Kundennummer“ abfragen möchtest, muss das zeilenbasierte Format jede Zeile durchlaufen, während Parquet nur die „Kundennummer“-Spalte laden kann. Das spart Zeit und Rechenressourcen.
Gegen wir noch ein wenig auf die Partitionierung ein.
Partitionierung
Nehmen wir an wir habe eine CSV Datei mit Kundendaten. Diese könnte wie in diesem sehr einfache. Beispiel:
id,name,region,land,kundennummer
1,Alice,EMEA,DE,10000
2,Bob,EMEA,FR,10001
3,Charlie,APAC,JP,10002
4,Diana,EMEA,DE,10003
5,Eric,APAC,JP,10004
Mit Parquet könnte das dann so aussehen abgelegt sein:
kunden_parquet/
├── region=EMEA/
│ ├── land=DE/
│ │ ├── part-00000-...-c000.parquet
│ │ └── part-00001-...-c000.parquet
│ └── land=FR/
│ ├── part-00000-...-c000.parquet
│ └── ...
└── region=APAC/
└── land=JP/
├── part-00000-...-c000.parquet
└── ...
Die Partitionierung der Daten kann selbst festgelegt werden. Im Beispiel wurde nach "region" und dann nach "land" partitioniert.
Der Aufbau von Parquet Files
Parquet nutzt mehrere Techniken, um die Speicherkapazität zu optimieren und die Lese- und Schreibgeschwindigkeit zu maximieren. Hier sind die wichtigsten Techniken:
-
Spaltenbasierte Speicherung: Daten werden spaltenweise gespeichert, was bedeutet, dass alle Werte einer bestimmten Spalte zusammen gespeichert werden. Dies ermöglicht eine bessere Kompression und schnellere Lesezeiten, insbesondere bei analytischen Abfragen.
-
Kompression: Parquet unterstützt mehrere Kompressionstechniken (wie Snappy, Gzip oder LZ4), die es dir ermöglichen, den Speichermenge zu minimieren. Eine gute Kompression kann signifikante Einsparungen bei großen Datensätzen bieten.
-
Schema: Parquet verwendet ein sehr flexibles Schema, das es ermöglicht, komplizierte Datentypen wie verschachtelte Strukturen oder Arrays zu speichern. Das Schema wird im Dateikopf gespeichert, sodass die Struktur zu jedem Zeitpunkt zur Verfügung steht.
-
Metadaten: Parquet speichert wichtige Meta-Informationen, die ebenfalls helfen, effizienter auf die Daten zuzugreifen. Dazu gehören Informationen über die Anzahl der Zeilen, die Kompression und das Schema, was die Datenanalyse erheblich vereinfacht.
Einsatzbereich von Parquet Files
Parquet hat sich als das bevorzugte Format für Data Lakes und datenintensive Anwendungen etabliert. Die Einsatzmöglichkeiten sind vielfältig:
-
Big Data-Analytik: Durch die spaltenbasierte Speicherung und die exzellente Kompression ermöglicht Parquet eine effiziente Datenverarbeitung mit Werkzeugen wie Apache Spark oder Apache Hive. Wenn du große Datenmengen analysieren möchtest, ist Parquet oft die erste Wahl. Es ist fast eine Art Industriestandard.
-
Data Warehousing: Bei Data Warehouses, in denen große Datenmengen entlang verschiedener Dimensionen abgerufen werden, bietet Parquet die nötige Geschwindigkeit und Effizienz.
-
Machine Learning: Bei der Verarbeitung von Trainingsdaten für Machine-Learning-Modelle kann Parquet helfen, die Daten optimal zu speichern und schnell darauf zuzugreifen.
-
Datenintegration: Viele moderne Tools im Bereich der Datenintegration, unterstützen Parquet direkt. Das vereinfach die die Verwendung in ETL-Prozessen erheblich.
Tools
Wer Daten im Parquet Format vorliegen hat und einmal reinschauen möchte kann z.B eines der folgenden Tools nutzen.
Hier sind ein paar Tools die ich sehr gerne nutze.
parquet-cli
Das Tool kann das Schema einer Parquet Datei (oder Verzeichnis) anzeigen. Die Daten können dann im CSV Format ausgegeben werden.
Daten können bgefragt und gefiltert werden.
https://github.com/chhantyal/parquet-cli
DuckDB
DuckDB ist eine sogenannte In-Process-SQL-Engine. DuckDB selbst nutze ich ab und an sehr gerne in Jupyter Notebooks da man damit sehr einfach per SQL auf Daten in verschiedenen Formaten (auch CSV) zu greifen kann. Mit DuckDB kann man auch auf Parquet Datei zugreifen und dann direkt die Spalten per SQL selektieren. Sehr praktisch.
PyArrow Library
In der Python Welt sind die Bibliotheken numpy und pandas sehr bekannt, wenn es um Datenanalyse geht.
Die Bibliothek pyarrow (ebenfalls von Apache) kann hier noch eine gute Ergänzung sein.
Hier ein Beispiel in dem wir eine Pandas Dataframe erzeugen, was sehr gängig ist.
import numpy as np
import pandas as pd
import pyarrow as pa
df = pd.DataFrame({'one': [-1, np.nan, 2.5],
'two': ['foo', 'bar', 'baz'],
'three': [True, False, True]},
index=list('abc'))
Über pyarrow können wir nun einen Pandas Dataframe sehr einfach als Paquet Datei wegschreiben.
import pyarrow.parquet as pq
table = pa.Table.from_pandas(df)
pq.write_table(table, 'example.parquet')
Wer mehr Infos und den genauen Aufbau des Formats verstehen woll kann auf der offiziellen Webseite https://parquet.apache.org/ mehr Infos finden.