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.