Eseguire la conversione tra i dataframe PySpark e pandas

Informazioni su come convertire i dataframe apache Spark in e da dataframe pandas usando Apache Arrow in Azure Databricks.

Apache Arrow e PyArrow

Apache Arrow è un formato di dati a colonne in memoria usato in Apache Spark per trasferire in modo efficiente i dati tra processi JVM e Python. Questo è utile per gli sviluppatori Python che lavorano con i dati pandas e NumPy. Tuttavia, l'utilizzo richiede alcune piccole modifiche di configurazione o codice per garantire la compatibilità e ottenere il massimo vantaggio.

PyArrow è un'associazione Python per Apache Arrow ed è installata in Databricks Runtime. Per informazioni sulla versione di PyArrow disponibile in ogni versione di Databricks Runtime, vedere le versioni e la compatibilità delle note sulla versione di Databricks Runtime.

Tipi SQL supportati

Tutti i tipi di dati Spark SQL sono supportati dalla conversione basata su freccia ad eccezione ArrayType di TimestampType. MapType e ArrayType di annidati StructType sono supportati solo quando si usa PyArrow 2.0.0 e versioni successive. StructType è rappresentato come invece pandas.DataFrame di pandas.Series.

Convertire i dataframe PySpark in e da dataframe pandas

La freccia è disponibile come ottimizzazione quando si converte un dataframe PySpark in un dataframe pandas con toPandas() e quando si crea un dataframe PySpark da un dataframe pandas con createDataFrame(pandas_df).

Per usare Arrow per questi metodi, impostare la configurazione spark.sql.execution.arrow.pyspark.enabled di Spark su true. Questa configurazione è abilitata per impostazione predefinita, ad eccezione dei cluster a concorrenza elevata e dei cluster di isolamento utente nelle aree di lavoro abilitate per Unity Catalog.

Inoltre, le ottimizzazioni abilitate da spark.sql.execution.arrow.pyspark.enabled potrebbero eseguire il fallback a un'implementazione non Arrow se si verifica un errore prima del calcolo all'interno di Spark. È possibile controllare questo comportamento usando la configurazione spark.sql.execution.arrow.pyspark.fallback.enableddi Spark .

Esempio

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()

L'uso delle ottimizzazioni freccia produce gli stessi risultati di quando Arrow non è abilitato. Anche con Arrow, toPandas() la raccolta di tutti i record nel DataFrame viene eseguita nel programma driver e deve essere eseguita su un piccolo subset dei dati.

Inoltre, non tutti i tipi di dati Spark sono supportati e può essere generato un errore se una colonna ha un tipo non supportato. Se si verifica un errore durante createDataFrame(), Spark crea il dataframe senza freccia.