PySparkとパンダの間で変換 DataFrames

データ ブリックで Apache Arrow を使用して、Apache Spark DataFrames をパンダとの間で変換 DataFrames 方法について説明します。

Apache Arrow と PyArrow

Apache Arrow は、JVMプロセスとPythonプロセス間でデータを効率的に転送するために Apache Spark で使用されるメモリ内の列指向データ形式です。 これは、パンダとNumPyデータを扱うPython開発者にとって有益です。 ただし、その使用には、互換性を確保し、最大の利益を得るために、いくつかのマイナーな構成またはコードの変更が必要です。

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

サポートされている SQL タイプ

矢印ベースの変換では、 MapTypeArrayType TimestampType、入れ子になった StructTypeを除くすべての Spark SQL データ型がサポートされています。StructTypepandas.Seriesではなく pandas.DataFrame として表されます。BinaryType は、PyArrow バージョン 0.10.0 以降でのみサポートされています。

PySpark DataFrames パンダへ変換、およびMVDから変換 DataFrames

矢印は、PySpark DataFrame を toPandas() でパンダ DataFrame に変換するとき、および createDataFrame(pandas_df)を使用してパンダのデータフレームから PySpark DataFrame を作成するときに最適化として使用できます。

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

さらに、 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 を使用しても、 toPandas() は DataFrame 内のすべてのレコードをドライバー プログラムに収集するため、データの小さなサブセットに対して実行する必要があります。

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