Converter entre PySpark e Pandas DataFrames
Saiba como converter Apache Spark DataFrames de e para Pandas DataFrames usando Apache Arrow em Databricks.
Apache Arrow e PyArrow
O Apache Arrow é um formato de dados colunares na memória usado no Apache Spark para transferir dados com eficiência entre os processos JVM e Python. Isso é benéfico para os desenvolvedores de Python que trabalham com dados de Pandas e NumPy. No entanto, seu uso requer algumas pequenas alterações na configuração ou no código para garantir a compatibilidade e obter o máximo benefício.
O PyArrow é uma ligação Python para o 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 asDatabricks Runtime notas sobre versões e compatibilidade.
Tipos de SQL suportados
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 a partir de um Pandas DataFrame 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 é ativada por default, exceto para cluster de alta simultaneidade e cluster de isolamento de usuário no espaço de trabalho, que são ativados por Unity Catalog.
Além disso, as otimizações ativadas pelo site spark.sql.execution.arrow.pyspark.enabled
podem voltar a uma implementação que não seja do Spark se ocorrer um erro antes do cálculo no Spark. O senhor 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()
Usar as otimizações do Arrow produz os mesmos resultados de quando o Arrow não está ativado. Mesmo com o Arrow, o 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 são compatíveis e um erro pode ser gerado se uma coluna tiver um tipo não compatível. Se ocorrer um erro durante createDataFrame()
, o Spark cria o DataFrame sem Arrow.