Share via


Conversión entre DataFrames de PySpark y Pandas

Obtenga información sobre cómo convertir Apache Spark DataFrames hacia y desde pandas DataFrames mediante Apache Arrow en Azure Databricks.

Apache Arrow y PyArrow

Apache Arrow es un formato de datos en columnas en memoria que se usa en Apache Spark para transferir datos de forma eficaz entre los procesos de JVM y Python. Esto es beneficioso para los desarrolladores de Python que trabajan con datos de pandas y NumPy. Sin embargo, su uso requiere algunos cambios de código o configuración menores para garantizar la compatibilidad y obtener el máximo beneficio.

PyArrow es un enlace de Python para Apache Arrow y se instala en Databricks Runtime. Para obtener más información sobre la versión de PyArrow disponible en cada versión de Databricks Runtime, consulte las Notas de la versión de Databricks Runtime versiones y compatibilidad.

Tipos de SQL admitidos

Todos los tipos de datos de Spark SQL son compatibles con la conversión basada en Arrow, excepto MapType, ArrayType de TimestampType y StructType anidados. StructType se representa como pandas.DataFrame en lugar de pandas.Series. BinaryType solo se admite para las versiones 0.10.0 y posteriores de PyArrow.

Conversión de PySpark DataFrames hacia y desde Pandas DataFrames

Arrow está disponible como optimización al convertir una instancia de PySpark DataFrame en una instancia de Pandas DataFrame con toPandas() y al crear una instancia de PySpark DataFrame a partir de Pandas DataFrame con createDataFrame(pandas_df).

Para usar Arrow para estos métodos, establezca la configuración de Sparkspark.sql.execution.arrow.pyspark.enabled en true. Esta configuración está habilitada de forma predeterminada, excepto los clústeres de alta simultaneidad, así como los clústeres de aislamiento de usuario en áreas de trabajo habilitadas para Unity Catalog.

Además, las optimizaciones habilitadas mediante spark.sql.execution.arrow.pyspark.enabled podrían volver a una implementación que no sea de Arrow si se produce un error antes del realizar cálculo en Spark. Puede controlar este comportamiento mediante la configuración de Spark spark.sql.execution.arrow.pyspark.fallback.enabled.

Ejemplo

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

El uso de las optimizaciones de flechas genera los mismos resultados que cuando Arrow no está habilitado. Incluso con Arrow, toPandas() da como resultado la colección de todos los registros de DataFrame al programa del controlador, y debe realizarse en un pequeño subconjunto de los datos.

Asimismo, no se admiten todos los tipos de datos de Spark y se puede generar un error si una columna tiene un tipo no admitido. Si se produce un error durante createDataFrame(), Spark crea el elemento de Dataframe sin Arrow.