Apache Spark とパンダの間の変換の最適化Optimizing Conversion between Apache Spark and pandas DataFrames

Apache Arrowは、JVM と Python プロセス間で効率的にデータを転送するために、Spark で使用されるメモリ内の列形式のデータ形式です。Apache Arrow is an in-memory columnar data format used in Spark to efficiently transfer data between JVM and Python processes. これは、パンダと NumPy のデータを操作する Python ユーザーに役立ちます。This is beneficial to Python users that work with pandas and NumPy data. ただし、その使用方法は自動ではなく、完全な機能を利用して互換性を確保するために、構成またはコードに若干の変更を加える必要があります。However, its usage is not automatic and requires some minor changes to configuration or code to take full advantage and ensure compatibility.

パンダとの間の変換Convert to/from pandas

toPandas() の呼び出しを使用して Spark のデータフレームをパンダデータフレームに変換する場合や、createDataFrame(pandas_df)でパンダデータフレームから Spark データフレームを作成する場合は、矢印を最適化することができます。Arrow is available as an optimization when converting a Spark DataFrame to a pandas DataFrame using the call toPandas() and when creating a Spark DataFrame from a pandas DataFrame with createDataFrame(pandas_df). これらの呼び出しを実行するときに矢印を使用するには、Spark 構成 spark.sql.execution.arrow.enabledtrue に設定します。To use Arrow when executing these calls, set the Spark configuration spark.sql.execution.arrow.enabled to true. 既定では、この構成は無効になっています。This configuration is disabled by default.

さらに、Spark 内の計算の前にエラーが発生した場合、spark.sql.execution.arrow.enabled によって有効にされた最適化は、矢印以外の実装に戻る可能性があります。In addition, optimizations enabled by spark.sql.execution.arrow.enabled could fall back to a non-Arrow implementation if an error occurs before the computation within Spark. この動作は、Spark 構成 spark.sql.execution.arrow.fallback.enabled を使用して制御できます。You can control this behavior using the Spark configuration spark.sql.execution.arrow.fallback.enabled.


import numpy as np
import pandas as pd

# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.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()

上の最適化を矢印で使用すると、矢印が有効になっていない場合と同じ結果が生成されます。Using the above optimizations with Arrow produces the same results as when Arrow is not enabled. toPandas() 矢印がある場合でも、データフレームのすべてのレコードがドライバープログラムに収集され、データの小さなサブセットで実行される必要があります。Even with Arrow, toPandas() results in the collection of all records in the DataFrame to the driver program and should be done on a small subset of the data.

また、すべての Spark データ型がサポートされているわけではありません。列の型がサポートされていない場合は、エラーが発生する可能性があります。In addition, not all Spark data types are supported and an error can be raised if a column has an unsupported type. createDataFrame()中にエラーが発生した場合、Spark は戻り、矢印のないデータフレームを作成します。If an error occurs during createDataFrame(), Spark falls back to create the DataFrame without Arrow.

サポートされる SQL の種類Supported SQL types

PyArrow 0.8.0 以降は Databricks Runtime 4.0-5.1 にインストールされます。PyArrow 0.8.0 is installed in Databricks Runtime 4.0-5.1. Databricks Runtime 5.1 以降では、MapTypeTimestampTypeArrayType および入れ子になった StructType を除く、すべての Spark SQL データ型が矢印ベースの変換によってサポートされています。In Databricks Runtime 5.1 and above, all Spark SQL data types are supported by Arrow-based conversion except MapType, ArrayType of TimestampType, and nested StructType. BinaryType は、PyArrow が0.10.0 以上の場合にのみサポートされます。BinaryType is supported only when PyArrow is equal to or higher than 0.10.0.