Оптимизация преобразования между PySparkми и Pandas кадрами данных

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

Версии PyArrow

PyArrow устанавливается в Databricks Runtime. Сведения о версии PyArrow, доступной в каждой версии Databricks Runtime, см. в заметках о выпуске среды выполнения для модуляданных.

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

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

Преобразование кадров данных PySpark в кадры данных Pandas и из них

Стрелка доступна в качестве оптимизации при преобразовании кадра данных PySpark в кадр данных Pandas с помощью toPandas() и при создании кадра данных PySpark из Pandas таблицы данных с помощью createDataFrame(pandas_df) . Чтобы использовать стрелку для этих методов, задайте для конфигурации Spark spark.sql.execution.arrow.enabled значение true . По умолчанию эта конфигурация отключена.

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

Пример

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

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

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