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.