Optimera konverteringen mellan PySpark och Pandas DataFrames

Apache-pilen är ett InMemory-dataformat 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. Användningen är dock inte automatisk och kräver vissa mindre ändringar i konfigurationen eller koden för att dra full nytta och säkerställa kompatibiliteten.

PyArrow-versioner

PyArrow installeras i Databricks Runtime. Information om vilken version av PyArrow som är tillgänglig i varje Databricks Runtime version finns i versions anteckningar för Databricks runtime.

SQL-typer som stöds

Alla Spark SQL-datatyper stöds av en pil-baserad konvertering MapType förutom ArrayType , TimestampType och kapslad StructType . StructTyperepresenteras som en pandas.DataFrame i stället för pandas.Series . BinaryTypestöds endast när PyArrow är lika med eller högre än 0.10.0.

Konvertera PySpark DataFrames till och från Pandas DataFrames

Pilen är tillgänglig som en 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 pilen för dessa metoder ställer du in Spark-konfigurationen spark.sql.execution.arrow.enabledtrue . Den här konfigurationen är inaktive rad som standard.

Dessutom kan optimeringar som Aktiver ATS genom spark.sql.execution.arrow.enabled att gå tillbaka till en icke-pil-implementering om ett fel inträffar före beräkningen i Spark. Du kan styra detta beteende med Spark-konfigurationen spark.sql.execution.arrow.fallback.enabled .

Exempel

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

Med hjälp av pil-optimeringar får du samma resultat som när pilen inte är aktive rad. Även om pilen toPandas() resulterar i insamlingen av alla poster i DataFrame till driv rutins programmet och bör utföras på en liten delmängd av data.

Dessutom stöds inte alla Spark-datatyper och ett fel kan aktive ras om en kolumn har en typ som inte stöds. Om ett fel inträffar under createDataFrame() , går Spark tillbaka för att skapa DataFrame utan pil.