PySpark と pandas DataFrame 間で変換する

Azure Databricks で Apache Arrow を使用して、Apache Spark DataFrame と pandas DataFrame の間で相互に変換する方法について説明します。

Apache Arrow と PyArrow

Apache Arrow は、JVM と Python のプロセス間で効率的にデータを転送するために Apache Spark で使用されるインメモリの列指向データ形式です。 これは、pandas と NumPy データを使用する Python 開発者に役立ちます。 ただし、その使用にあたっては、互換性を確保して最大限のメリットを得るために、構成またはコードにいくつかの軽微な変更が必要になります。

PyArrow は Apache Arrow の Python バインドであり、Databricks Runtime にインストールされます。 各 Databricks Runtime バージョンで使用できる PyArrow のバージョンについては、Databricks Runtime リリース ノートのバージョンと互換性 を参照してください。

サポートされている SQL の型

MapTypeTimestampTypeArrayType、およびネストされた StructType を除くすべての Spark SQL データ型が、Arrow ベースの変換でサポートされています。 StructType は、pandas.Series ではなく pandas.DataFrame として表されます。 BinaryType は、PyArrow バージョン 0.10.0 以降でのみサポートされています。

PySpark DataFrame と pandas DataFrame の間の変換

toPandas() を使用して PySpark DataFrame を pandas DataFrame に変換する場合と、createDataFrame(pandas_df) を使用して pandas DataFrame から PySpark DataFrame を作成する場合の最適化として Arrow を使用できます。

これらのメソッドに Arrow を使用するには、Spark 構成spark.sql.execution.arrow.pyspark.enabledtrue に設定します。 この構成は、高コンカレンシー クラスターと、Unity カタログが有効になっているワークスペース内のユーザー分離クラスターを除き、既定で有効になります。

また、spark.sql.execution.arrow.pyspark.enabled で有効化された最適化は、Spark での計算の前にエラーが発生した場合、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 が有効になっていない場合と同じ結果を生成します。 Arrow を使用した場合でも、toPandas() は、結果として DataFrame 内のすべてのレコードをドライバー プログラムに収集し、データの小規模なサブセットに対して実行されます。

また、すべての Spark データ型がサポートされているわけではなく、列にサポートされていない型が含まれている場合は、エラーが発生する可能性があります。 createDataFrame() でエラーが発生した場合、Spark によって Arrow なしに DataFrame が作成されます。