Compartilhar via


Converter entre os DataFrames do PySpark e do Pandas

Saiba como converter DataFrames do Apache Spark de/para DataFrames do Pandas usando o Apache Arrow no Azure Databricks.

Apache Arrow e PyArrow

O Apache Arrow é um formato de dados colunar na memória usado no Apache Spark para transferir dados com eficiência entre os processos JVM e Python. Isso é útil para desenvolvedores do Python que trabalham com dados do Pandas e do NumPy. No entanto, o uso dele requer algumas pequenas alterações de configuração ou código para que seja possível aproveitá-lo ao máximo e garantir a compatibilidade.

O PyArrow é uma associação do Python para Apache Arrow e está instalado no Databricks Runtime. Para obter informações sobre a versão do PyArrow disponível em cada Databricks Runtime, consulte as Notas sobre a versão do Databricks Runtime.

Tipos de SQL com suporte

Todos os tipos de dados do Spark SQL têm suporte para conversão baseada no Arrow, exceto ArrayType de TimestampType. MapType e ArrayType de StructType aninhados só têm suporte ao usar o PyArrow 2.0.0 e superior. StructType é representado como um pandas.DataFrame em vez de pandas.Series.

Converter DataFrames do PySpark em e a partir de DataFrames do pandas

O Arrow está disponível como uma otimização ao converter um DataFrame do PySpark em um DataFrame do pandas com toPandas() e ao criar um DataFrame do PySpark com base em um DataFrame do pandas com createDataFrame(pandas_df).

Para usar o Arrow para esses métodos, defina a Configuração do Spark spark.sql.execution.arrow.pyspark.enabled como true. Essa configuração é habilitada por padrão, exceto para clusters de Alta Simultaneidade, bem como clusters de isolamento do usuário em workspaces habilitados para o Catálogo do Unity.

Além disso, as otimizações habilitadas pelo spark.sql.execution.arrow.pyspark.enabled poderão fazer fall-back para uma implementação que não seja do Arrow se ocorrer um erro antes da computação no Spark. Você pode controlar esse comportamento usando a configuração do Spark spark.sql.execution.arrow.pyspark.fallback.enabled.

Exemplo

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

O uso das otimizações do Arrow produz os mesmos resultados de quando o Arrow não está habilitado. Mesmo com o Arrow, o toPandas() resulta na coleta de todos os registros no DataFrame para o programa de driver e deve ser feito em um pequeno subconjunto dos dados.

Além disso, nem todos os tipos de dados do Spark têm suporte, e um erro poderá ser gerado se uma coluna tiver um tipo sem suporte. Se ocorrer um erro durante o createDataFrame(), o Spark criará o DataFrame sem o Arrow.