Partitionieren von Datendateien

Abgeschlossen

Die Partitionierung ist eine Optimierungsmethode, mit der Spark die Leistung über die Arbeitsknoten hinweg maximieren kann. Beim Filtern von Daten in Abfragen können weitere Leistungssteigerungen erzielt werden, indem unnötige Datenträger-E/A-Vorgänge eliminiert werden.

Partitionieren der Ausgabedatei

Um einen Dataframe als partitionierte Gruppe von Dateien zu speichern, verwenden Sie beim Schreiben der Daten die partitionBy-Methode.

Im folgenden Beispiel wird ein abgeleitetes Jahr Feld erstellt. Anschließend wird sie verwendet, um die Daten zu partitionieren.

from pyspark.sql.functions import year, col

# Load source data
df = spark.read.csv('/orders/*.csv', header=True, inferSchema=True)

# Add Year column
dated_df = df.withColumn("Year", year(col("OrderDate")))

# Partition by year
dated_df.write.partitionBy("Year").mode("overwrite").parquet("/data")

Die Ordnernamen, die beim Partitionieren eines Datenframes generiert werden, enthalten den Partitionierungsspaltennamen und -wert in einem column=value Format, wie hier gezeigt:

Diagramm, das eine partitionierte Dateiordnerstruktur darstellt.

Hinweis

Sie können die Daten nach mehreren Spalten partitionieren, wodurch eine Hierarchie von Ordnern für jeden Partitionsschlüssel entsteht. Beispielsweise könnten Sie die Reihenfolge im Beispiel nach Jahr und Monat partitionieren, sodass die Ordnerhierarchie einen Ordner für jeden Jahreswert enthält, der wiederum einen Unterordner für jeden Monatswert enthält.

Filtern von Parquet-Dateien in einer Abfrage

Beim Lesen von Daten aus Parkettdateien in einen Dataframe haben Sie die Möglichkeit, Daten aus einem beliebigen Ordner in den hierarchischen Ordnern abzurufen. Dieser Filtervorgang erfolgt mit der Verwendung expliziter Werte und Wildcards für die partitionierten Felder.

Im folgenden Beispiel ruft der folgende Code die Verkaufsaufträge ab, die 2020 platziert wurden.

orders_2020 = spark.read.parquet('/partitioned_data/Year=2020')
display(orders_2020.limit(5))

Hinweis

Die im Dateipfad angegebenen Partitionierungsspalten werden im resultierenden Dataframe nicht angegeben. Die ergebnisse, die von der Beispielabfrage erzeugt werden, enthalten keine Jahr Spalte - alle Zeilen stammen aus 2020.