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 a nyílalapú átalakítás, kivéve ArrayType
a TimestampType
. MapType
és ArrayType
a beágyazott StructType
elemek csak a PyArrow 2.0.0-s és újabb verzióiban támogatottak. StructType
a helyett pandas.Series
a pandas.DataFrame
.
PySpark DataFrame-ek konvertálása pandas DataFrame-ekre és -ről
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íl parancsot szeretné használni ezekhez a metódusokhoz, állítsa a Spark-konfigurációt spark.sql.execution.arrow.pyspark.enabled
a következőretrue
: . 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.
Emellett az általuk engedélyezett spark.sql.execution.arrow.pyspark.enabled
optimalizálás visszaeshet egy nem nyíl 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.enabled
szabá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. A DataFrame-ben lévő összes rekordot a Nyíllal toPandas()
is az illesztőprogram-programba gyűjti, és az adatok egy kis részhalmazán kell 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.