共用方式為


在 PySpark 與 pandas DataFrame 之間轉換

瞭解如何在 Azure Databricks 中使用 Apache Arrow,將 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 類型

除了ArrayTypeTimestampType之外,基於 Arrow 的轉換支援所有 Spark SQL 資料類型。 MapTypeArrayType 的巢狀 StructType 只有在使用 PyArrow 2.0.0 以上版本時才支援。 StructType 表示為 pandas.DataFrame 而不是 pandas.Series

將 PySpark DataFrame 轉換成 pandas DataFrame,以及從 pandas DataFrame 轉換回 PySpark DataFrame

在使用toPandas()將 PySpark DataFrame 轉換成 pandas DataFrame,以及使用createDataFrame(pandas_df)從 pandas DataFrame 建立 PySpark DataFrame 的過程中,可以利用 Arrow 作為優化工具。

若要針對這些方法使用 Arrow,請將 Spark 組態spark.sql.execution.arrow.pyspark.enabled 設定為 true。 預設會啟用此組態,但對於已啟用 Unity Catalog 的工作區中的高併行叢集和使用者隔離叢集則除外。

此外,若在 Spark 的計算中出現錯誤,spark.sql.execution.arrow.pyspark.enabled 所啟用的優化可能會回退至非 Arrow 的實作。 您可以使用 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 會建立沒有箭號的數據框架。