Converteren tussen PySpark en pandas DataFrames

Meer informatie over het converteren van Apache Spark DataFrames naar en van pandas DataFrames met behulp van Apache Arrow in Azure Databricks.

Apache Arrow en PyArrow

Apache Arrow is een in-memory kolomgegevensindeling die wordt gebruikt in Apache Spark om 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 vereist echter enkele kleine configuratie- of codewijzigingen om compatibiliteit te garanderen en het meeste voordeel te krijgen.

PyArrow is een Python-binding voor Apache Arrow en wordt geïnstalleerd in Databricks Runtime. Zie de releaseversies en compatibiliteit van Databricks Runtime voor meer informatie over de versie van PyArrow die beschikbaar is in elke Databricks Runtime-versie.

Ondersteunde SQL-typen

Alle Spark SQL-gegevenstypen worden ondersteund door conversie op basis van pijlen, behalve MapType, ArrayType van TimestampTypeen geneste StructType. StructType wordt weergegeven als een pandas.DataFrame in plaats van pandas.Series. BinaryType wordt alleen ondersteund voor PyArrow-versies 0.10.0 en hoger.

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 toPandas() en bij het maken van een PySpark DataFrame vanuit een pandas DataFrame met createDataFrame(pandas_df).

Als u Pijl voor deze methoden wilt gebruiken, stelt u de Spark-configuratiespark.sql.execution.arrow.pyspark.enabled in op true. Deze configuratie is standaard ingeschakeld, met uitzondering van clusters met hoge gelijktijdigheid en clusters voor gebruikersisolatie in werkruimten waarvoor Unity Catalog is ingeschakeld.

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

Opmerking

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

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

Bovendien worden niet alle Spark-gegevenstypen ondersteund en kan er een fout optreden als een kolom een niet-ondersteund type heeft. Als er een fout optreedt tijdens createDataFrame()het maken van een DataFrame zonder pijl.