Optimiser la conversion entre PySpark et pandas tramesOptimize conversion between PySpark and pandas DataFrames

Apache Arrow est un format de données en colonnes en mémoire utilisé dans Apache Spark pour transférer efficacement des données entre des processus JVM et Python.Apache Arrow is an in-memory columnar data format used in Apache Spark to efficiently transfer data between JVM and Python processes. Cela est bénéfique pour les développeurs Python qui utilisent des données pandas et NumPy.This is beneficial to Python developers that work with pandas and NumPy data. Toutefois, son utilisation n’est pas automatique et nécessite des modifications mineures de la configuration ou du code pour tirer pleinement parti et garantir la compatibilité.However, its usage is not automatic and requires some minor changes to configuration or code to take full advantage and ensure compatibility.

Versions de PyArrowPyArrow versions

PyArrow est installé dans Databricks Runtime.PyArrow is installed in Databricks Runtime. Pour plus d’informations sur la version de PyArrow disponible dans chaque version de Databricks Runtime, consultez les notes de publication de Databricks Runtime.For information on the version of PyArrow available in each Databricks Runtime version, see the Databricks runtime release notes.

Types SQL pris en chargeSupported SQL types

Tous les types de données Spark SQL sont pris en charge par la conversion basée sur les flèches, à l’exception MapType ArrayType de, de TimestampType et imbriqués StructType .All Spark SQL data types are supported by Arrow-based conversion except MapType, ArrayType of TimestampType, and nested StructType. StructTypeest représenté en tant que pandas.DataFrame au lieu de pandas.Series .StructType is represented as a pandas.DataFrame instead of pandas.Series. BinaryTypeest pris en charge uniquement lorsque PyArrow est supérieur ou égal à 0.10.0.BinaryType is supported only when PyArrow is equal to or higher than 0.10.0.

Convertir PySpark trames vers et à partir de pandas tramesConvert PySpark DataFrames to and from pandas DataFrames

La flèche est disponible en tant qu’optimisation lors de la conversion d’un tableau PySpark en tableau pandas avec toPandas() et lors de la création d’un tableau PySpark à partir d’un tableau pandas avec 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). Pour utiliser la flèche pour ces méthodes, affectez à la configuration Spark la valeur spark.sql.execution.arrow.enabled true .To use Arrow for these methods, set the Spark configuration spark.sql.execution.arrow.enabled to true. Cette configuration est désactivée par défaut.This configuration is disabled by default.

En outre, les optimisations activées par spark.sql.execution.arrow.enabled peuvent revenir à une implémentation non-flèche si une erreur se produit avant le calcul dans 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. Vous pouvez contrôler ce comportement à l’aide de la configuration Spark spark.sql.execution.arrow.fallback.enabled .You can control this behavior using the Spark configuration spark.sql.execution.arrow.fallback.enabled.

ExempleExample

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()

L’utilisation des optimisations de flèche produit les mêmes résultats que lorsque la flèche n’est pas activée.Using the Arrow optimizations produces the same results as when Arrow is not enabled. Même avec la flèche, les toPandas() résultats de la collection de tous les enregistrements dans le tableau sont exécutés dans le programme de pilote et doivent être effectués sur un petit sous-ensemble de données.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.

En outre, tous les types de données Spark ne sont pas pris en charge et une erreur peut être déclenchée si une colonne a un type non pris en charge.In addition, not all Spark data types are supported and an error can be raised if a column has an unsupported type. Si une erreur se produit pendant createDataFrame() , Spark revient à créer le tableau sans flèche.If an error occurs during createDataFrame(), Spark falls back to create the DataFrame without Arrow.