Konvertieren zwischen PySpark- und Pandas-DataFrames
Hier erfahren Sie, wie Sie Apache Spark-DataFrames in und aus Pandas-DataFrames konvertieren können, indem Sie Apache Arrow in Azure Databricks nutzen.
Apache Arrow und PyArrow
Apache Arrow ist ein spaltenbasiertes In-Memory-Datenformat, das in Apache Spark für die effiziente Übertragung von Daten zwischen JVM- und Python-Prozessen verwendet wird. Dies ist für Python-Entwickler von Vorteil, die mit Pandas- und NumPy-Daten arbeiten. Die Verwendung erfolgt jedoch nicht automatisch und erfordert einige kleinere Änderungen an der Konfiguration oder am Code, um die Kompatibilität zu gewährleisten und die Vorteile voll auszuschöpfen.
PyArrow ist eine Python-Bindung für Apache Arrow und wird in Databricks Runtime installiert. Informationen zu der in jeder Databricks Runtime-Version verfügbaren Version von PyArrow finden Sie unter Versionshinweise zu Databricks Runtime-Versionen und -Kompatibilität.
Unterstützte SQL-Typen
Alle Spark SQL-Datentypen werden von der Arrow-basierten Konvertierung unterstützt, ausgenommen ArrayType
von TimestampType
. MapType
und ArrayType
vom geschachtelten StructType
werden nur bei Verwendung von PyArrow 2.0.0 und höher unterstützt. StructType
wird als anstelle von pandas.Series
als pandas.DataFrame
dargestellt.
Konvertieren von PySpark-DataFrames in und aus Pandas-DataFrames
Arrow steht zur Optimierung bei der Konvertierung eines PySpark-DataFrames in einen Pandas-DataFrame mit toPandas()
und bei der Erstellung eines PySpark-DataFrames aus einem Pandas-DataFrame mit createDataFrame(pandas_df)
zur Verfügung.
Um Arrow für diese Methoden zu verwenden, legen Sie die Spark-Konfiguration spark.sql.execution.arrow.pyspark.enabled
auf true
fest. Diese Konfiguration ist standardmäßig aktiviert, außer bei Clustern mit hoher Parallelität und bei Clustern mit Benutzerisolierung in Arbeitsbereichen, für die Unity Catalog aktiviert ist.
Darüber hinaus können Optimierungen, die durch spark.sql.execution.arrow.pyspark.enabled
aktiviert werden, auf eine Nicht-Arrow-Implementierung zurückgreifen, wenn vor der Berechnung in Spark ein Fehler auftritt. Sie können dieses Verhalten mithilfe der Spark-Konfiguration spark.sql.execution.arrow.pyspark.fallback.enabled
steuern.
Beispiel
import numpy as np
import pandas as pd
# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true")
# Generate a pandas DataFrame
pdf = pd.DataFrame(np.random.rand(100, 3))
# Create a Spark DataFrame from a pandas DataFrame using Arrow
df = spark.createDataFrame(pdf)
# Convert the Spark DataFrame back to a pandas DataFrame using Arrow
result_pdf = df.select("*").toPandas()
Die Verwendung der Arrow-Optimierungen führt zu denselben Ergebnissen wie bei nicht aktiviertem Arrow. Selbst mit Arrow führt toPandas()
dazu, dass alle Datensätze im DataFrame im Treiberprogramm erfasst werden. Daher sollte dies nur für eine kleine Teilmenge der Daten geschehen.
Außerdem werden nicht alle Spark-Datentypen unterstützt, und es kann ein Fehler ausgelöst werden, wenn eine Spalte einen nicht unterstützten Typ aufweist. Wenn während der Ausführung von createDataFrame()
ein Fehler auftritt, erstellt Spark den DataFrame ohne Arrow.