Converter entre DataFrames PySpark e pandas

Saiba como converter Apache Spark DataFrames de e para pandas DataFrames usando o Apache Arrow no 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 é benéfico para desenvolvedores Python que trabalham com pandas e dados NumPy. No entanto, seu uso requer algumas pequenas configurações ou alterações de código para garantir a compatibilidade e obter o máximo de benefícios.

PyArrow é uma ligação Python para Apache Arrow e está 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 notas do Databricks Runtime sobre a versão versões e compatibilidade.

Tipos de SQL compatíveis

Todos os tipos de dados do Spark SQL são compatíveis com a conversão baseada em seta, exceto MapType, ArrayType de TimestampType e StructType aninhados. StructType é representado como um pandas.DataFrame em vez de pandas.Series. BinaryType é compatível apenas com as versões 0.10.0e acima do PyArrow.

Converter PySpark DataFrames de e para pandas DataFrames

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

Para usar Arrow para esses métodos, defina a configuração do Spark spark.sql.execution.arrow.pyspark.enabled como true. Esta configuração é habilitada por default , exceto para cluster de alta simultaneidade, bem como clusters de isolamento de usuário no workspace que estão habilitados para o Unity Catalog.

Além disso, as otimizações ativadas por spark.sql.execution.arrow.pyspark.enabled podem retornar a uma implementação não Arrow se ocorrer um erro antes do cálculo 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 de seta produz os mesmos resultados de quando a seta não está ativada. Mesmo com Arrow, toPandas() resulta na coleta de todos os registros no DataFrame para o programa do 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 pode ser gerado se uma coluna tiver um tipo sem suporte. Se ocorrer um erro durante createDataFrame(), o Spark criará o DataFrame sem seta.