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.enabled
di 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.