Optimalizujte převod mezi PySpark a datovými rámečky PANDAS
Šipka Apache je sloupcový formát dat v paměti, který se používá v Apache Spark k efektivnímu přenosu dat mezi procesy JVM a Pythonu. To je užitečné pro vývojáře v Pythonu, kteří pracují s daty PANDAS a NumPy. Jeho použití není ale automatické a vyžaduje některé menší změny konfigurace nebo kódu, aby plně využila a zajistila kompatibilitu.
Verze PyArrow
PyArrow je nainstalován v Databricks Runtime. Informace o verzi PyArrow dostupné v každé verzi Databricks Runtime najdete v poznámkách k verzi modulu runtime datacihly.
Podporované typy SQL
Všechny datové typy Spark SQL jsou podporovány převodem na základě šipek s výjimkou, MapType
ArrayType
TimestampType
a vnořených StructType
. StructType
je reprezentován jako pandas.DataFrame
místo pandas.Series
.
BinaryType
je podporováno pouze v případě, že je PyArrow rovno nebo větší než 0.10.0.
Převod PySparkch datarámců na a z PANDAS
Šipka je k dispozici jako optimalizace při převodu PySpark dataframe na PANDAS dataframe s toPandas()
a při vytváření PySpark dataframe z objektu PANDAS dataframe s createDataFrame(pandas_df)
.
Pro použití šipky pro tyto metody nastavte konfiguraci Sparku spark.sql.execution.arrow.enabled
na true
.
Tato konfigurace je ve výchozím nastavení zakázaná.
Optimalizace, které jsou povolené nástrojem, spark.sql.execution.arrow.enabled
by navíc mohly přejít zpátky k implementaci bez šipky, pokud dojde k chybě před výpočtem ve Sparku.
Toto chování můžete řídit pomocí konfigurace Sparku spark.sql.execution.arrow.fallback.enabled
.
Příklad
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()
Když použijete optimalizace šipky, vznikne stejné výsledky, jako když není zapnutá šipka. I u šipky je toPandas()
výsledkem kolekce všech záznamů v datovém rámci k programu ovladače a měla by být provedena na malé podmnožině dat.
Kromě toho nejsou podporovány všechny datové typy Spark a chybu lze vyvolat, pokud sloupec obsahuje nepodporovaný typ. Pokud dojde k chybě createDataFrame()
v průběhu, Spark se vrátí k vytvoření datového rámce bez šipky.