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 Spark SQL são compatíveis com a conversão baseada em setas, exceto ArrayType
de TimestampType
. MapType
e ArrayType
de StructType
aninhados são suportados apenas quando o PyArrow 2.0.0 e acima são usados. StructType
é representado como pandas.DataFrame
em vez de pandas.Series
.
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.