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.