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.