Partilhar via


Converter entre PySpark e pandas DataFrames

Saiba como converter Apache Spark DataFrames de e para pandas DataFrames usando a Seta Apache no Azure Databricks.

Seta Apache e PyArrow

Apache Arrow é um formato de dados colunares na memória usado no Apache Spark para transferir dados de forma eficiente entre processos JVM e Python. Isso é benéfico para desenvolvedores Python que trabalham com pandas e dados NumPy. No entanto, seu uso requer algumas pequenas alterações de configuração ou código para garantir a compatibilidade e obter o máximo benefício.

PyArrow é uma ligação Python para Apache Arrow e é instalado no Databricks Runtime. Para obter informações sobre a versão do PyArrow disponível em cada versão do Databricks Runtime, consulte as versões e compatibilidade das notas de versão do Databricks Runtime.

Tipos de SQL suportados

Todos os tipos de dados do Spark SQL são suportados pela conversão baseada em Seta, exceto ArrayType de TimestampType. MapType e ArrayType de aninhados StructType são suportados apenas ao usar o PyArrow 2.0.0 e superior. StructType é representado como um pandas.DataFrame em vez de pandas.Series.

Converta DataFrames PySpark de e para pandas DataFrames

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

Para usar a seta para esses métodos, defina a configuração spark.sql.execution.arrow.pyspark.enabled do Spark como true. Essa configuração é habilitada por padrão, exceto para clusters de alta simultaneidade, bem como clusters de isolamento de usuário em espaços de trabalho habilitados para o Unity Catalog.

Além disso, as otimizações habilitadas por spark.sql.execution.arrow.pyspark.enabled podem voltar para uma implementação que não seja Seta se ocorrer um erro antes da computação no Spark. Você pode controlar esse comportamento usando a configuração spark.sql.execution.arrow.pyspark.fallback.enableddo Spark .

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 de seta produz os mesmos resultados de quando a seta não está habilitada. Mesmo com Arrow, 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 são suportados e um erro pode ser gerado se uma coluna tiver um tipo sem suporte. Se ocorrer um erro durante createDataFrame()o , o Spark criará o DataFrame sem Seta.