Otimizar a conversão entre PySpark e pandas DataFrames

Apache Arrow é um formato de dados colunar na memória usado em Apache Spark para transferir eficientemente dados entre os processos JVM e Python. Isto é benéfico para os desenvolvedores de Python que trabalham com pandas e dados NumPy. No entanto, a sua utilização não é automática e requer algumas pequenas alterações na configuração ou código para tirar o máximo partido e garantir a compatibilidade.

Versões PyArrow

O PyArrow está instalado no tempo de execução de dados. Para obter informações sobre a versão do PyArrow disponível em cada versão Databricks Runtime, consulte as notas de lançamento do prazo de execução databricks.

Tipos de SQL suportados

Todos os tipos de dados Spark SQL são suportados por conversão baseada em MapType seta, exceto, ArrayType TimestampType de, e aninhado StructType . StructType é representado como um pandas.DataFrame em vez de pandas.Series . BinaryType é suportado apenas quando PyArrow é igual ou superior a 0.10.0.

Converter DataFrames PySpark de e para pandas DataFrames

A seta está disponível como uma otimização ao converter um DataFrame PySpark para um DataFrame de pandas com toPandas() e ao criar um DataFrame PySpark a partir de um DataFrame de pandas com createDataFrame(pandas_df) . Para utilizar a seta para estes métodos, desaperte a configuração spark spark.sql.execution.arrow.enabled para true . Esta configuração é desativada por predefinição.

Além disso, as otimizações ativadas podem spark.sql.execution.arrow.enabled recair para uma implementação não-Seta se ocorrer um erro antes da computação dentro do Spark. Pode controlar este comportamento utilizando a configuração Spark spark.sql.execution.arrow.fallback.enabled .

Exemplo

import numpy as np
import pandas as pd

# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.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()

A utilização das otimizações de seta produz os mesmos resultados que quando a seta não está ativada. Mesmo com o Arrow, toPandas() resulta na recolha de todos os registos do DataFrame para o programa do controlador e deve ser feito num pequeno subconjunto dos dados.

Além disso, nem todos os tipos de dados spark são suportados e um erro pode ser levantado se uma coluna tiver um tipo não suportado. Se ocorrer um erro createDataFrame() durante, a Faísca volta a criar o DataFrame sem seta.