Konwertowanie między ramkami danych PySpark i pandas
Dowiedz się, jak konwertować ramki danych platformy Apache Spark na i z ramek danych biblioteki pandas przy użyciu narzędzia Apache Arrow w usłudze Azure Databricks.
Apache Arrow i PyArrow
Apache Arrow to format danych kolumnowych w pamięci używany w platformie Apache Spark do wydajnego przesyłania danych między procesami JVM i Python. Jest to korzystne dla deweloperów języka Python, którzy pracują z danymi biblioteki pandas i biblioteki NumPy. Jednak jego użycie wymaga pewnych drobnych zmian konfiguracji lub kodu w celu zapewnienia zgodności i uzyskania największej korzyści.
PyArrow to powiązanie języka Python dla narzędzia Apache Arrow i jest instalowane w środowisku Databricks Runtime. Aby uzyskać informacje na temat wersji PyArrow dostępnej w każdej wersji środowiska Databricks Runtime, zobacz informacje o wersji i zgodności środowiska Databricks Runtime.
Obsługiwane typy SQL
Wszystkie typy danych Spark SQL są obsługiwane przez konwersję opartą na strzałkach z wyjątkiem ArrayType
TimestampType
.
MapType
i ArrayType
zagnieżdżonych StructType
są obsługiwane tylko w przypadku użycia PyArrow 2.0.0 lub nowszej.
StructType
jest reprezentowany jako pandas.DataFrame
zamiast pandas.Series
.
Konwertowanie ramek danych PySpark na i z ramek danych pandas
Strzałka jest dostępna jako optymalizacja podczas konwertowania ramki danych PySpark na ramkę danych pandas za pomocą toPandas()
i podczas tworzenia ramki danych PySpark na podstawie ramki danych pandas za pomocą createDataFrame(pandas_df)
.
Aby użyć Arrow dla tych metod, ustaw konfigurację platformy Spark na true
. Ta konfiguracja jest domyślnie włączona, z wyjątkiem klastrów o wysokiej współbieżności oraz klastrów izolacji użytkowników w obszarach roboczych, które mają włączony katalog Unity.
Ponadto optymalizacje włączone przez spark.sql.execution.arrow.pyspark.enabled
mogą wrócić do implementacji bez użycia Arrow, jeśli wystąpi błąd przed obliczeniami na platformie Spark. To zachowanie można kontrolować przy użyciu konfiguracji spark.sql.execution.arrow.pyspark.fallback.enabled
platformy Spark.
Przykład
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()
Użycie optymalizacji strzałki powoduje uzyskanie takich samych wyników, jak w przypadku, gdy strzałka nie jest włączona. Nawet z Arrow toPandas()
wynikiem jest zebranie wszystkich rekordów z ramki danych do programu sterującego i należy to robić na małym podzbiorze danych.
Ponadto nie wszystkie typy danych platformy Spark są obsługiwane i może zostać zgłoszony błąd, jeśli kolumna ma nieobsługiwany typ. Jeśli wystąpi błąd podczas createDataFrame()
, Spark tworzy ramkę danych bez użycia Arrow.