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


Что такое определяемые пользователем функции (определяемые пользователем функции)?

Определяемая пользователем функция (UDF) — это функция, определяемая пользователем, что позволяет повторно использовать пользовательскую логику в пользовательской среде. Azure Databricks поддерживает множество различных типов определяемых пользователем типов, чтобы обеспечить распространение расширяемой логики. В этой статье приводятся некоторые из общих преимуществ и ограничений определяемых пользователем пользователей.

Примечание.

Не все формы определяемых пользователем типов доступны во всех средах выполнения в Azure Databricks. Если вы работаете с каталогом Unity, ознакомьтесь с определяемыми пользователем функциями в каталоге Unity.

Определение пользовательской логики без штрафов сериализации

Azure Databricks наследует большую часть его поведения UDF от Apache Spark, включая ограничения эффективности для многих типов определяемых пользователем типов. Узнайте , какие определяемые пользователем функции являются наиболее эффективными?.

Вы можете безопасно модульизировать код, не беспокоясь о потенциальных компромиссах эффективности, связанных с определяемых пользователем пользователем функций. Для этого необходимо определить логику как ряд встроенных методов Spark с помощью SQL или Spark DataFrames. Например, следующие функции SQL и Python объединяют встроенные методы Spark для определения преобразования единиц в качестве многократно используемых функций:

SQL

CREATE FUNCTION convert_f_to_c(unit STRING, temp DOUBLE)
RETURNS DOUBLE
RETURN CASE
  WHEN unit = "F" THEN (temp - 32) * (5/9)
  ELSE temp
END;

SELECT convert_f_to_c(unit, temp) AS c_temp
FROM tv_temp;

Python

def convertFtoC(unitCol, tempCol):
  from pyspark.sql.functions import when
  return when(unitCol == "F", (tempCol - 32) * (5/9)).otherwise(tempCol)

from pyspark.sql.functions import col

df_query = df.select(convertFtoC(col("unit"), col("temp"))).toDF("c_temp")
display(df_query)

Чтобы запустить приведенные выше определяемые пользователем функции, можно создать примеры данных.

Какие определяемые пользователем функции наиболее эффективны?

Определяемые пользователем функции могут привести к значительным узким местам обработки в выполнении кода. Azure Databricks использует несколько различных оптимизаторов автоматически для кода, написанного с включенным синтаксисом Apache Spark, SQL и Delta Lake. Если пользовательская логика представлена определяемыми пользователем функциями, эти оптимизаторы не могут эффективно планировать задачи по этой пользовательской логике. Кроме того, логика, которая выполняется за пределами JVM, имеет дополнительные затраты на сериализацию данных.

Примечание.

Azure Databricks оптимизирует множество функций с помощью Photon при использовании вычислительных ресурсов с поддержкой Photon. Только функции, которые объединяют команды Spark SQL dataFrame, можно оптимизировать с помощью Photon.

Некоторые определяемые пользователем функции более эффективны, чем другие. С точки зрения производительности:

  • Встроенные функции будут самыми быстрыми из-за оптимизаторов Azure Databricks.
  • Код, который выполняется в JVM (Scala, Java, Hive UDFs) будет быстрее, чем определяемые пользователем Python.
  • Пользовательские функции Pandas используют стрелку для уменьшения затрат на сериализацию, связанных с определяемых пользователем Python.
  • Определяемые пользователем Функции Python хорошо работают для процедурной логики, но их следует избегать для рабочих нагрузок ETL в больших наборах данных.

Примечание.

В Databricks Runtime 12.2 LTS и ниже скалярные определяемые пользователем UDFs Python и Pandas не поддерживаются в каталоге Unity в кластерах, использующих режим общего доступа. Эти определяемые пользователем функции поддерживаются в Databricks Runtime 13.3 LTS и более поздних версий для всех режимов доступа.

В Databricks Runtime 14.1 и ниже скалярные определяемые пользователем функции Scala не поддерживаются в каталоге Unity в кластерах, использующих режим общего доступа. Эти определяемые пользователем функции поддерживаются для всех режимов доступа в Databricks Runtime 14.2 и более поздних версий.

В Databricks Runtime 13.3 LTS и более поздних версиях можно зарегистрировать скалярные пользовательские файлы Python в каталоге Unity с помощью синтаксиса SQL. См . определяемые пользователем функции в каталоге Unity.

Тип Оптимизированная Среда выполнения
Определяемая пользователем функция Hive No Виртуальная машина Java
Python UDF No Python
Pandas UDF No Python (стрелка)
Scala UDF No Виртуальная машина Java
SQL Spark Да JVM (Фотон)
Кадр данных Spark Да JVM (Фотон)

Когда следует использовать UDF?

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

Для заданий ETL, операций потоковой передачи, операций с очень большими наборами данных или другими рабочими нагрузками, которые выполняются регулярно или непрерывно, рефакторинг логики для использования собственных методов Apache Spark быстро платят дивиденды.

Примеры данных для примеров определяемых пользователем типов

Примеры кода в этой статье используют определяемые пользователем функции для преобразования температур между Celcius и Farenheit. Если вы хотите выполнить эти функции, можно создать пример набора данных с помощью следующего кода Python:

import numpy as np
import pandas as pd

Fdf = pd.DataFrame(np.random.normal(55, 25, 10000000), columns=["temp"])
Fdf["unit"] = "F"

Cdf = pd.DataFrame(np.random.normal(10, 10, 10000000), columns=["temp"])
Cdf["unit"] = "C"

df = spark.createDataFrame(pd.concat([Fdf, Cdf]).sample(frac=1))

df.cache().count()
df.createOrReplaceTempView("tv_temp")