Optimieren der Konvertierung zwischen pyspark-und Pandas-dataframesOptimize conversion between PySpark and pandas DataFrames

Der Apache-Pfeil ist ein Datenformat im Arbeitsspeicher, das in Apache Spark zum effizienten Übertragen von Daten zwischen JVM-und python-Prozessen verwendet wird.Apache Arrow is an in-memory columnar data format used in Apache Spark to efficiently transfer data between JVM and Python processes. Dies ist nützlich für python-Entwickler, die mit Pandas und numpy-Daten arbeiten.This is beneficial to Python developers that work with pandas and NumPy data. Die Verwendung erfolgt jedoch nicht automatisch und erfordert einige geringfügige Änderungen an der Konfiguration oder dem Code, damit Sie vollständig genutzt werden und die Kompatibilität gewährleisten kann.However, its usage is not automatic and requires some minor changes to configuration or code to take full advantage and ensure compatibility.

Pypfeil-VersionenPyArrow versions

Pypfeil ist in Databricks Runtime installiert.PyArrow is installed in Databricks Runtime. Weitere Informationen zur in den einzelnen Databricks Runtime Versionen verfügbaren pypfeil-Version finden Sie in den Versions Anmerkungen zur databricks-Laufzeit.For information on the version of PyArrow available in each Databricks Runtime version, see the Databricks runtime release notes.

Unterstützte SQL-TypenSupported SQL types

Alle Spark-SQL-Datentypen werden von der Pfeil basierten Konvertierung mit Ausnahme MapType ArrayType von, of TimestampType und schsted unterstützt StructType .All Spark SQL data types are supported by Arrow-based conversion except MapType, ArrayType of TimestampType, and nested StructType. StructTypewird pandas.DataFrame anstelle von als dargestellt pandas.Series .StructType is represented as a pandas.DataFrame instead of pandas.Series. BinaryTypewird nur unterstützt, wenn pypfeil gleich oder größer als 0.10.0 ist.BinaryType is supported only when PyArrow is equal to or higher than 0.10.0.

Konvertieren von pyspark-dataframes in und aus Pandas-dataframesConvert PySpark DataFrames to and from pandas DataFrames

Der Pfeil ist als Optimierung verfügbar, wenn ein pyspark-dataframe mit toPandas() und beim Erstellen eines pyspark-dataframes aus einem Pandas-dataframe mit in einen Pandas-dataframe integriert wird createDataFrame(pandas_df) .Arrow is available as an optimization when converting a PySpark DataFrame to a pandas DataFrame with toPandas() and when creating a PySpark DataFrame from a pandas DataFrame with createDataFrame(pandas_df). Legen Sie die Spark-Konfiguration auf fest, um den Pfeil für diese Methoden zu verwenden spark.sql.execution.arrow.enabled true .To use Arrow for these methods, set the Spark configuration spark.sql.execution.arrow.enabled to true. Diese Konfiguration ist standardmäßig deaktiviert.This configuration is disabled by default.

Außerdem könnten durch aktivierte Optimierungen spark.sql.execution.arrow.enabled auf eine nicht-Pfeil-Implementierung zurückgreifen, wenn vor der Berechnung in Spark ein Fehler auftritt.In addition, optimizations enabled by spark.sql.execution.arrow.enabled could fall back to a non-Arrow implementation if an error occurs before the computation within Spark. Sie können dieses Verhalten mithilfe der Spark-Konfiguration steuern spark.sql.execution.arrow.fallback.enabled .You can control this behavior using the Spark configuration spark.sql.execution.arrow.fallback.enabled.

BeispielExample

import numpy as np
import pandas as pd

# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.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 Pfeil Optimierungen führt zu denselben Ergebnissen wie bei nicht aktiviertem Pfeil.Using the Arrow optimizations produces the same results as when Arrow is not enabled. Selbst bei Pfeil toPandas() ergibt die Sammlung aller Datensätze im dataframe für das Treiber Programm und sollte für eine kleine Teilmenge der Daten ausgeführt werden.Even with Arrow, toPandas() results in the collection of all records in the DataFrame to the driver program and should be done on a small subset of the data.

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.In addition, not all Spark data types are supported and an error can be raised if a column has an unsupported type. Wenn ein Fehler während auftritt createDataFrame() , greift Spark zurück, um den dataframe ohne Pfeil zu erstellen.If an error occurs during createDataFrame(), Spark falls back to create the DataFrame without Arrow.