Conversie optimaliseren tussen PySpark en pandas DataFrames

Apache Arrow is een kolomgegevensindeling in het geheugen die wordt gebruikt in Apache Spark efficiënt gegevens over te dragen tussen JVM- en Python-processen. Dit is nuttig voor Python-ontwikkelaars die werken met pandas- en NumPy-gegevens. Het gebruik ervan is echter niet automatisch en vereist enkele kleine wijzigingen in de configuratie of code om optimaal te profiteren van de compatibiliteit.

PyArrow-versies

PyArrow is geïnstalleerd in Databricks Runtime. Zie releasenotities voor Databricks Runtimevoor informatie over de versie van PyArrow die beschikbaar is in elke Databricks Runtime versie.

Ondersteunde SQL typen

Alle Spark SQL-gegevenstypen worden ondersteund door op pijl gebaseerde MapType conversie, behalve , ArrayType van en TimestampType genest StructType . StructType wordt weergegeven als een pandas.DataFrame in plaats van pandas.Series . BinaryType wordt alleen ondersteund als PyArrow gelijk is aan of hoger is dan 0.10.0.

PySpark DataFrames converteren naar en van pandas DataFrames

Pijl is beschikbaar als optimalisatie bij het converteren van een PySpark DataFrame naar een Pandas DataFrame met en bij het maken van een toPandas() PySpark DataFrame van een Pandas DataFrame met createDataFrame(pandas_df) . Als u Pijl wilt gebruiken voor deze methoden, stelt u de Spark-configuratie in spark.sql.execution.arrow.enabled op true . Deze configuratie is standaard uitgeschakeld.

Bovendien kunnen optimalisaties die worden ingeschakeld door terugvallen op een implementatie zonder pijl als er een fout optreedt vóór spark.sql.execution.arrow.enabled de berekening in Spark. U kunt dit gedrag bepalen met behulp van de Spark-configuratie spark.sql.execution.arrow.fallback.enabled .

Voorbeeld

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()

Het gebruik van de pijloptimalisaties levert dezelfde resultaten op als wanneer Pijl niet is ingeschakeld. Zelfs met Pijl resulteert in het verzamelen van alle records in het DataFrame naar het stuurprogrammaprogramma en moet worden uitgevoerd op een kleine toPandas() subset van de gegevens.

Bovendien worden niet alle Spark-gegevenstypen ondersteund en kan er een fout worden weergegeven als een kolom een niet-ondersteund type heeft. Als er een fout optreedt tijdens createDataFrame() , valt Spark terug om het DataFrame te maken zonder pijl.