PySpark とパンダの間の変換を最適化するOptimize conversion between PySpark and pandas DataFrames

Apache Arrow は、JVM と Python のプロセス間でデータを効率的に転送するために Apache Spark で使用されるメモリ内の列形式のデータ形式です。Apache Arrow is an in-memory columnar data format used in Apache Spark to efficiently transfer data between JVM and Python processes. これは、パンダと NumPy のデータを操作する Python 開発者にとって役立ちます。This is beneficial to Python developers 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.

PyArrow のバージョンPyArrow versions

PyArrow は Databricks Runtime にインストールされます。PyArrow is installed in Databricks Runtime. 各 Databricks Runtime バージョンで利用可能な PyArrow のバージョンの詳細については、 Databricks Runtime のリリースノートを参照してください。For information on the version of PyArrow available in each Databricks Runtime version, see the Databricks runtime release notes.

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

すべての Spark SQL データ型は、、、および入れ子になっているを除く、矢印ベースの変換によってサポートされ MapType ArrayType TimestampType StructType ます。All Spark SQL data types are supported by Arrow-based conversion except MapType, ArrayType of TimestampType, and nested StructType. StructType は、ではなく、として表され pandas.DataFrame pandas.Series ます。StructType is represented as a pandas.DataFrame instead of pandas.Series. BinaryType は、PyArrow が0.10.0 以上の場合にのみサポートされます。BinaryType is supported only when PyArrow is equal to or higher than 0.10.0.

PySpark Dataframes からパンダへの変換Convert PySpark DataFrames to and from pandas DataFrames

矢印は、PySpark データフレームをと共にパンダデータフレームに変換するときの最適化として使用でき toPandas() ます。また、でパンダデータフレームから PySpark データフレームを作成するときにも使用でき createDataFrame(pandas_df) ます。Arrow is available as an optimization when converting a PySpark DataFrame to a pandas DataFrame with toPandas() and when creating a PySpark DataFrame from a pandas DataFrame with createDataFrame(pandas_df). これらの方法で矢印を使用するには、 Spark 構成 spark.sql.execution.arrow.enabled をに設定し true ます。To use Arrow for these methods, set the Spark configuration spark.sql.execution.arrow.enabled to true. 既定では、この構成は無効になっています。This configuration is disabled by default.

さらに、によって有効になった最適化は、 spark.sql.execution.arrow.enabled Spark 内の計算の前にエラーが発生した場合に、矢印以外の実装に戻る可能性があります。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.

Example

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 Arrow optimizations 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.