Partager via


Effectuer une conversion entre PySpark et les DataFrames Pandas

Découvrez comment convertir Apache Spark DataFrames vers et à partir de pandas DataFrames à l’aide d’Apache Arrow dans Azure Databricks.

Apache Arrow et PyArrow

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. Cela est bénéfique pour les développeurs Python qui utilisent des données pandas et NumPy. Toutefois, son utilisation nécessite des modifications mineures de configuration ou de code pour garantir la compatibilité et tirer le meilleur parti.

PyArrow est une liaison Python pour Apache Arrow et est installé dans Databricks Runtime. Pour plus d'informations sur la version de PyArrow disponible dans chaque version de Databricks Runtime, consultez les versions et compatibilité des notes de version de Databricks Runtime.

Types SQL pris en charge

Tous les types de données Spark SQL sont pris en charge par la conversion basée sur les flèches, excepté ArrayType de TimestampType. MapType et ArrayType du StructType imbriqué ne sont pris en charge que lors de l’utilisation de PyArrow 2.0.0 (et des versions ultérieures). StructType est représenté en tant que pandas.DataFrame au lieu de pandas.Series.

Convertir PySpark DataFrames vers et à partir de pandas DataFrames

La flèche est disponible en tant qu’optimisation lors de la conversion de PySpark DataFrame en pandas DataFrame avec toPandas() et lors de la création de PySpark DataFrame à partir de pandas DataFrame avec createDataFrame(pandas_df).

Pour utiliser Arrow pour ces méthodes, configurez Sparkspark.sql.execution.arrow.pyspark.enabled sur true. Cette configuration est activée par défaut, à l’exception des clusters haute concurrence ainsi que des clusters d’isolation utilisateur dans les espaces de travail activés dans le catalogue Unity.

En outre, les optimisations activées par spark.sql.execution.arrow.pyspark.enabled peuvent revenir à une implémentation non-Arrow si une erreur se produit avant le calcul dans Spark. Vous pouvez contrôler ce comportement à l’aide de la configuration spark.sql.execution.arrow.pyspark.fallback.enabled de Spark.

Exemple

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

L’utilisation des optimisations d’Arrow produit les mêmes résultats que lorsqu’Arrow n’est pas activée. Même avec Arrow, les résultats toPandas() de la collection de tous les enregistrements dans DataFrame sont exécutés dans le programme de pilote et doivent être effectués sur un petit sous-ensemble de données.

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. Si une erreur se produit pendant createDataFrame(), Spark crée DataFrame sans Arrow.