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


Преобразование между PySpark и pandas DataFrames

Узнайте, как преобразовать кадры данных Apache Spark и из pandas DataFrames с помощью Apache Arrow в 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 для этих методов, задайте для конфигурации Sparkspark.sql.execution.arrow.pyspark.enabled значение true. Эта конфигурация включена по умолчанию, за исключением кластеров с высоким параллелизмом, а также кластеров с изоляцией пользователей в рабочих областях с включенным каталогом Unity.

Кроме того, оптимизация, включенная с помощью 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 создает кадр данных без стрелки.