Konvertera mellan PySpark och Pandas DataFrames

Lär dig hur du konverterar Apache Spark DataFrames till och från Pandas DataFrames med Apache Arrow i Azure Databricks.

Apache Arrow och PyArrow

Apache Arrow är ett minnesinternt kolumndataformat som används i Apache Spark för att effektivt överföra data mellan JVM- och Python-processer. Detta är fördelaktigt för Python-utvecklare som arbetar med Pandas- och NumPy-data. Dess användning kräver dock vissa mindre konfigurations- eller kodändringar för att säkerställa kompatibilitet och få mest nytta.

PyArrow är en Python-bindning för Apache Arrow och installeras i Databricks Runtime. Information om vilken version av PyArrow som är tillgänglig i varje Databricks Runtime-version finns i viktig information om versioner och kompatibilitet för Databricks Runtime.

SQL-typer som stöds

Alla Spark SQL-datatyper stöds av pilbaserad konvertering förutom ArrayType TimestampType. MapType och ArrayType av kapslade StructType stöds endast när du använder PyArrow 2.0.0 och senare. StructType representeras som en pandas.DataFrame i stället för pandas.Series.

Konvertera PySpark DataFrames till och från Pandas DataFrames

Pil är tillgänglig som optimering när du konverterar en PySpark DataFrame till en Pandas DataFrame med toPandas() och när du skapar en PySpark DataFrame från en Pandas DataFrame med createDataFrame(pandas_df).

Om du vill använda Arrow för dessa metoder anger du Spark-konfigurationen spark.sql.execution.arrow.pyspark.enabled till .true Den här konfigurationen är aktiverad som standard förutom kluster med hög samtidighet samt kluster för användarisolering på arbetsytor som är Aktiverade i Unity Catalog.

Dessutom kan optimeringar som aktiveras av spark.sql.execution.arrow.pyspark.enabled återgå till en icke-Arrow-implementering om ett fel inträffar före beräkningen i Spark. Du kan styra det här beteendet med hjälp av Spark-konfigurationen spark.sql.execution.arrow.pyspark.fallback.enabled.

Exempel

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

Om du använder piloptimeringarna får du samma resultat som när Pilen inte är aktiverad. Även med Arrow resulterar toPandas() det i insamlingen av alla poster i DataFrame till drivrutinsprogrammet och bör göras på en liten delmängd av data.

Dessutom stöds inte alla Spark-datatyper och ett fel kan uppstå om en kolumn har en typ som inte stöds. Om ett fel uppstår under createDataFrame()skapar Spark dataramen utan pil.