Sdílet prostřednictvím


Převod mezi PySpark a pandas DataFrames

Naučte se převádět datové rámce Apache Sparku do datových rámců pandas a z datových rámců pandas pomocí Apache Arrow v Azure Databricks.

Apache Arrow a PyArrow

Apache Arrow je sloupcový formát dat v paměti používaný v Apache Sparku 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í ale vyžaduje některé menší změny konfigurace nebo kódu, aby se zajistila kompatibilita a získala největší výhodu.

PyArrow je vazba Pythonu pro Apache Arrow a je nainstalovaná v Databricks Runtime. Informace o verzi PyArrow dostupné v jednotlivých verzích databricks Runtime najdete v poznámkách k verzi a kompatibilitě modulu Databricks Runtime.

Podporované typy SQL

Všechny datové typy Spark SQL jsou podporovány převodem na základě šipky s výjimkou ArrayTypeTimestampType. MapType a ArrayType vnořené StructType jsou podporovány pouze při použití PyArrow 2.0.0 a vyšší. StructType je reprezentován jako pandas.DataFrame místo pandas.Series.

Převod datových rámců PySpark na a z datových rámců pandas

Arrow je k dispozici jako optimalizace při převodu PySpark DataFrame na pandas DataFrame s použitím toPandas() a při vytváření PySpark DataFrame z pandas DataFrame pomocí createDataFrame(pandas_df).

Pokud chcete pro tyto metody použít Arrow, nastavte konfiguraci Sparkuspark.sql.execution.arrow.pyspark.enabled na true. Tato konfigurace je ve výchozím nastavení povolená s výjimkou clusterů s vysokou souběžností a také clusterů izolace uživatelů v pracovních prostorech s povoleným katalogem Unity.

Kromě toho by optimalizace umožněné pomocí spark.sql.execution.arrow.pyspark.enabled mohly přejít na ne-Arrow implementaci, pokud dojde k chybě před výpočtem v rámci Sparku. Toto chování můžete řídit pomocí konfigurace spark.sql.execution.arrow.pyspark.fallback.enabledSparku .

Příklad

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

Použití optimalizace šipky vytvoří stejné výsledky jako v případech, kdy není šipka povolená. I když je to šipka, toPandas() výsledkem je shromažďování všech záznamů v datovém rámci do programu ovladače a mělo by být provedeno na malé podmnožině dat.

Kromě toho se nepodporují všechny datové typy Sparku a pokud sloupec obsahuje nepodporovaný typ, může se vyvolat chyba. Pokud dojde k chybě během createDataFrame(), Spark vytvoří datový rámec bez šipky.