ما هي الوظائف المعرفة من قبل المستخدم (UDFs)؟

الدالة المعرفة من قبل المستخدم (UDF) هي دالة يحددها المستخدم، ما يسمح بإعادة استخدام المنطق المخصص في بيئة المستخدم. يدعم Azure Databricks العديد من أنواع UDFs المختلفة للسماح بتوزيع منطق قابل للتوسيع. تقدم هذه المقالة بعض نقاط القوة والقيود العامة ل UDFs.

إشعار

لا تتوفر جميع أشكال UDFs في جميع بيئات التنفيذ على Azure Databricks. إذا كنت تعمل مع كتالوج Unity، فشاهد الوظائف المعرفة من قبل المستخدم (UDFs) في كتالوج Unity.

تعريف المنطق المخصص دون عقوبات التسلسل

ترث Azure Databricks الكثير من سلوكيات UDF الخاصة بها من Apache Spark، بما في ذلك قيود الكفاءة حول العديد من أنواع UDFs. راجع ما هي UDFs الأكثر كفاءة؟.

يمكنك تنظيم التعليمات البرمجية بأمان دون القلق بشأن المقايضات المحتملة للكفاءة المرتبطة بUDFs. للقيام بذلك، يجب تعريف المنطق الخاص بك كسلسلة من أساليب 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)

لتشغيل UDFs أعلاه، يمكنك إنشاء بيانات مثال.

ما هي UDFs الأكثر كفاءة؟

قد تقدم UDFs اختناقات معالجة كبيرة في تنفيذ التعليمات البرمجية. يستخدم Azure Databricks عددا من المحسنات المختلفة تلقائيا للتعليمات البرمجية المكتوبة باستخدام بناء جملة Apache Spark وSQL وData Lake المضمنة. عندما يتم تقديم المنطق المخصص من قبل UDFs، لا يملك هؤلاء المحسنون القدرة على تخطيط المهام بكفاءة حول هذا المنطق المخصص. بالإضافة إلى ذلك، يحتوي المنطق الذي ينفذ خارج JVM على تكاليف إضافية حول تسلسل البيانات.

إشعار

يعمل Azure Databricks على تحسين العديد من الوظائف باستخدام Photon إذا كنت تستخدم الحوسبة التي تدعم Photon. يمكن تحسين الوظائف التي تربط بين أوامر Spark SQL من DataFrame بواسطة Photon فقط.

بعض UDFs أكثر كفاءة من غيرها. من حيث الأداء:

  • ستكون الوظائف المضمنة أسرع بسبب محسنات Azure Databricks.
  • ستكون التعليمات البرمجية التي يتم تنفيذها في JVM (Scala وJava وHive UDFs) أسرع من Python UDFs.
  • تستخدم Pandas UDFs السهم لتقليل تكاليف التسلسل المرتبطة ب Python UDFs.
  • تعمل Python UDFs بشكل جيد للمنطق الإجرائي، ولكن يجب تجنبها لإنتاج أحمال عمل ETL على مجموعات البيانات الكبيرة.

إشعار

في Databricks Runtime 12.2 LTS والإدناه، لا يتم دعم Python scalar UDFs وPandas UDFs في كتالوج Unity على المجموعات التي تستخدم وضع الوصول المشترك. يتم دعم UDFs هذه في Databricks Runtime 13.3 LTS وما فوق لجميع أوضاع الوصول.

في Databricks Runtime 14.1 والإدناه، لا يتم دعم Scala UDFs العددية في كتالوج Unity على المجموعات التي تستخدم وضع الوصول المشترك. يتم دعم UDFs هذه لجميع أوضاع الوصول في Databricks Runtime 14.2 وما فوق.

في Databricks Runtime 13.3 LTS وما فوق، يمكنك تسجيل Python UDFs العددية في كتالوج Unity باستخدام بناء جملة SQL. راجع الدالات المعرفة من قبل المستخدم (UDFs) في كتالوج Unity.

نوع المحسن بيئة التنفيذ
Hive UDF لا Jvm
Python UDF لا Python
Pandas UDF لا Python (سهم)
Scala UDF لا Jvm
Spark SQL ‏‏نعم‬ JVM (Photon)
Spark DataFrame ‏‏نعم‬ JVM (Photon)

متى يجب استخدام UDF؟

تتمثل إحدى الفوائد الرئيسية ل UDFs في أنها تسمح للمستخدمين بالتعبير عن المنطق بلغات مألوفة، ما يقلل من التكلفة البشرية المرتبطة بإعادة بناء التعليمات البرمجية. بالنسبة للاستعلامات المخصصة، وتنقية البيانات يدويا، وتحليل البيانات الاستكشافية، ومعظم العمليات على مجموعات البيانات الصغيرة أو متوسطة الحجم، من غير المرجح أن تفوق التكاليف العامة لزمن الانتقال المرتبطة بUDFs التكاليف المرتبطة بإعادة بناء التعليمات البرمجية.

بالنسبة لوظائف ETL أو عمليات الدفق أو العمليات على مجموعات البيانات الكبيرة جدا أو أحمال العمل الأخرى التي يتم تنفيذها بانتظام أو باستمرار، فإن منطق إعادة بناء التعليمات البرمجية لاستخدام أساليب Apache Spark الأصلية يدفع بسرعة أرباحا.

مثال على البيانات على سبيل المثال UDFs

تستخدم أمثلة التعليمات البرمجية في هذه المقالة UDFs لتحويل درجات الحرارة بين 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")