瞭解如何在 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 類型
除了ArrayType
TimestampType
之外,基於 Arrow 的轉換支援所有 Spark SQL 資料類型。
MapType
和 ArrayType
的巢狀 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 會建立沒有箭號的數據框架。