Поделиться через


Конвертация между PySpark и pandas DataFrames

Узнайте, как с помощью Apache Arrow преобразовать DataFrames Apache Spark в и из DataFrames pandas в Azure Databricks.

Apache Arrow и PyArrow

Apache Arrow — это формат колоночных данных в памяти, используемый в Apache Spark для эффективного обмена данными между процессом виртуальной машины Java и процессом Python. Это полезно для разработчиков Python, работающих с пандами и данными NumPy. Однако его использование требует некоторых незначительных изменений конфигурации или кода, чтобы обеспечить совместимость и получить наибольшее преимущество.

PyArrow — это привязка Python для Apache Arrow и устанавливается в Databricks Runtime. Для получения информации о версии PyArrow, доступной в каждой версии среды выполнения Databricks, см. заметки о версиях и совместимости Databricks Runtime.

Поддерживаемые типы данных SQL

Все типы данных SQL Spark поддерживаются преобразованием со стрелками, за исключением ArrayTypeTimestampType. MapType и ArrayType в структуре вложенных StructType поддерживаются только при использовании PyArrow версии 2.0.0 и выше. StructType представляется как pandas.DataFrame, а не pandas.Series.

Преобразование PySpark DataFrames в pandas DataFrames и обратно

Arrow доступна как оптимизация в процессе преобразования PySpark DataFrame в pandas DataFrame с помощью toPandas() и при создании PySpark DataFrame из pandas DataFrame с помощью createDataFrame(pandas_df).

Чтобы использовать Arrow для этих методов, задайте для конфигурации Spark значение . Эта конфигурация включена по умолчанию, за исключением кластеров с высокой параллельностью, а также кластеров изоляции пользователей в рабочих областях с включённым Unity Catalog.

Кроме того, оптимизация, включённая spark.sql.execution.arrow.pyspark.enabled, может откатиться к не-Arrow реализации, если ошибка произойдет до вычисления в Spark. Это поведение можно контролировать с помощью конфигурации Spark spark.sql.execution.arrow.pyspark.fallback.enabled.

Пример

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

Использование оптимизации Arrow дает те же результаты, как если бы Arrow не включена. Даже с использованием Arrow, toPandas() приводит к сбору всех записей в DataFrame в программу драйвера и следует использовать только на небольшом подмножестве данных.

Кроме того, не все типы данных Spark поддерживаются и может возникать ошибка, если столбец имеет неподдерживаемый тип. При возникновении ошибки во время createDataFrame(), Spark создает DataFrame без использования Apache Arrow.