在 PySpark 與 pandas DataFrame 之間轉換
瞭解如何使用 Azure Databricks 中的 Apache 箭頭,將 Apache Spark DataFrame 轉換成 pandas DataFrame 和從 Pandas DataFrame。
Apache Arrow 和 PyArrow
Apache Arrow 是 Apache Spark 中用來有效率地在 JVM 與 Python 進程之間傳輸數據的記憶體記憶體記憶體數據格式。 這對使用 pandas 和 NumPy 數據的 Python 開發人員很有説明。 不過,其使用方式需要一些次要的組態或程式代碼變更,以確保相容性並取得最大效益。
PyArrow 是 Apache Arrow 的 Python 系結,並安裝在 Databricks Runtime 中。 如需每個 Databricks 執行時間版本中可用的 PyArrow 版本資訊,請參閱 Databricks Runtime 版本資訊版本和相容性。
支援的 SQL 類型
除了 之外,箭ArrayType
TimestampType
號型轉換支援所有Spark SQL資料類型。 MapType
只有在使用 PyArrow 2.0.0.0 和更新版本時,才支援巢狀 StructType
和 ArrayType
的 。 StructType
表示為 pandas.DataFrame
, pandas.Series
而不是 。
將 PySpark DataFrame 轉換成 pandas DataFrame,以及從 Pandas DataFrame 轉換
使用 將 PySpark DataFrame 轉換成 pandas DataFrame 時,以及使用 從 pandas DataFrame 建立 PySpark DataFrame toPandas()
createDataFrame(pandas_df)
時,箭號可作為優化。
若要針對這些方法使用 Arrow,請將 Spark 組態spark.sql.execution.arrow.pyspark.enabled
設定設定為 true
。 默認會啟用此組態,除了高併行叢集,以及已啟用 Unity 目錄之工作區中的使用者隔離叢集。
此外,如果 Spark 中的計算發生錯誤,所 spark.sql.execution.arrow.pyspark.enabled
啟用的優化可能會回復為非箭頭實作。 您可以使用 Spark 組態 spark.sql.execution.arrow.pyspark.fallback.enabled
來控制此行為。
範例
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()
使用箭頭優化會產生與未啟用Arrow時相同的結果。 即使使用 Arrow, toPandas()
也會讓 DataFrame 中的所有記錄集合到驅動程式程式,而且應該在一小部分的數據上完成。
此外,並非所有Spark資料類型都受到支援,而且如果數據行有不支援的類型,則可以引發錯誤。 如果在 期間 createDataFrame()
發生錯誤,Spark 會建立沒有箭號的數據框架。