Преобразование между 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 поддерживаются преобразованием со стрелками, за исключением ArrayType
TimestampType
. 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)
.
Чтобы использовать стрелку для этих методов, задайте для конфигурации Spark значение spark.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 создает кадр данных без стрелки.