Megosztás a következőn keresztül:


Konvertálás a PySpark és a pandas DataFrames között

Megtudhatja, hogyan konvertálhatja az Apache Spark DataFrame-eket pandas DataFrame-ekre az Apache Arrow használatával az Azure Databricksben.

Apache Arrow és PyArrow

Az Apache Arrow egy memórián belüli oszlopos adatformátum, amelyet az Apache Spark használ a JVM és a Python-folyamatok közötti adattovábbításhoz. Ez előnyös a Pandas és a NumPy-adatokkal dolgozó Python-fejlesztők számára. A használathoz azonban kisebb konfiguráció- vagy kódmódosítások szükségesek a kompatibilitás biztosításához és a legnagyobb haszonhoz.

A PyArrow egy Python-kötés az Apache Arrowhoz, és a Databricks Runtime-ban van telepítve. Az egyes Databricks Runtime-verziókban elérhető PyArrow verziójával kapcsolatos információkért tekintse meg a Databricks Runtime kibocsátási megjegyzéseinek verzióit és kompatibilitását.

Támogatott SQL-típusok

Az összes Spark SQL-adattípust támogatja az Arrow-alapú átalakítás, kivéve ArrayType a TimestampType. MapType és ArrayType a StructType beágyazott elemei csak a PyArrow 2.0.0 és újabb verziókban támogatottak. StructType úgy van ábrázolva, mint pandas.DataFrame, ahelyett, hogy pandas.Series lenne.

PySpark DataFrame-ek konvertálása pandas DataFrame-ekre és vissza

A Arrow optimalizálásként érhető el, ha PySpark DataFrame-et pandas DataFrame-gé toPandas() konvertál, és amikor PySpark DataFrame-et hoz létre egy pandas DataFrame-ből createDataFrame(pandas_df).

Ha a nyílbillentyűt szeretné használni ezekhez a metódusokhoz, állítsa a Spark konfigurációsspark.sql.execution.arrow.pyspark.enabledtrueértékre. Ez a konfiguráció alapértelmezés szerint engedélyezve van, kivéve a magas egyidejűségi fürtöket, valamint a Unity Catalog által engedélyezett munkaterületeken lévő felhasználóelkülönítési fürtöket.

Továbbá a spark.sql.execution.arrow.pyspark.enabled által engedélyezett optimalizálások visszaeshetnek egy nem Arrow implementációra, ha hiba történik a Sparkban végzett számítás előtt. Ezt a viselkedést a Spark-konfigurációval spark.sql.execution.arrow.pyspark.fallback.enabledszabályozhatja.

Példa

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

A nyíloptimalizálások ugyanazokat az eredményeket eredményezik, mint amikor a Nyíl nincs engedélyezve. Még az Arrow használatával is az összes rekordot a DataFrame-ból összegyűjti az illesztőprogram részeként futó programba, és ezt csak az adatok egy kis részhalmazán szabad elvégezni.

Emellett nem minden Spark-adattípus támogatott, és hiba is felmerülhet, ha egy oszlop nem támogatott típussal rendelkezik. Ha hiba történik a folyamat során createDataFrame(), a Spark a DataFrame-et nyíl nélkül hozza létre.