Aracılığıyla paylaş


Kullanıcı tanımlı işlevler (UDF) nedir?

Kullanıcı tanımlı işlevler (UDF), Azure Databricks'te yerleşik işlevselliği genişleten kodu yeniden kullanmanıza ve paylaşmanıza olanak tanır. UDF'leri kullanarak karmaşık hesaplamalar, dönüştürmeler veya özel veri işlemeleri gibi belirli görevleri gerçekleştirebilirsiniz.

Not

Paylaşılan erişim modu olan kümelerde, Python skaler UDF'leri Databricks Runtime 13.3 LTS ve üzerinde desteklenirken, Scala UDF'leri Databricks Runtime 14.2 ve üzerinde desteklenir.

Python skaler UDF'leri, Databricks Runtime 13.3 LTS ve üzerinde SQL söz dizimi kullanılarak Unity Kataloğu'nda kaydedilebilir. Bkz . Unity Kataloğu'nda Kullanıcı tanımlı işlevler (UDF' ler).

Ne zaman UDF kullanmalısınız?

Yerleşik Apache Spark işlevleriyle ifade etmek zor olan mantık için UDF'leri kullanın. Yerleşik Apache Spark işlevleri dağıtılmış işleme için iyileştirilmiştir ve genellikle büyük ölçekte daha iyi performans sunar. Daha fazla bilgi için bkz . İşlevler.

Databricks geçici sorgular, el ile veri temizleme, keşif veri analizi ve küçük ve orta ölçekli veri kümelerindeki işlemler için UDF'ler önerir. UDF'ler için yaygın kullanım örnekleri arasında veri şifreleme ve şifre çözme, karma oluşturma, JSON ayrıştırma ve doğrulama sayılabilir.

ÇOK büyük veri kümelerindeki işlemler ve ETL işleri ve akış işlemleri dahil olmak üzere düzenli veya sürekli olarak çalıştırılacak tüm iş yükleri için Apache Spark yöntemlerini kullanın.

Kayıtlı ve oturum kapsamı belirlenmiş UDF'ler

SQL kullanılarak oluşturulan UDF'ler Unity Kataloğu'na kaydedilir ve ilişkili izinlere sahipken, not defterinizde oluşturulan UDF'ler oturum tabanlıdır ve kapsamı geçerli SparkSession ile belirlenir.

Azure Databricks tarafından desteklenen herhangi bir dili kullanarak oturum tabanlı UDF'ler tanımlayabilir ve erişebilirsiniz. UDF'ler skaler veya skaler olmayan olabilir.

Not

Şu anda DBSQL'de yalnızca Unity Kataloğu'nda kayıtlı SQL ve Python skaler UDF'leri kullanılabilir.

Skaler UDF'ler

Skaler UDF'ler tek bir satırda çalışır ve her satır için tek bir değer döndürür. Aşağıdaki örnek, bir sütundaki her adın uzunluğunu hesaplamak ve değeri yeni namebir name_length sütuna eklemek için skaler UDF kullanır:

+-------+-------+
| name  | score |
+-------+-------+
| alice |  10.0 |
| bob   |  20.0 |
| carol |  30.0 |
| dave  |  40.0 |
| eve   |  50.0 |
+-------+-------+
-- Create a SQL UDF for name length
CREATE OR REPLACE FUNCTION get_name_length(name STRING)
RETURNS INT
RETURN LENGTH(name);

-- Use the UDF in a SQL query
SELECT name, get_name_length(name) AS name_length
FROM your_table;
+-------+-------+-------------+
| name  | score | name_length |
+-------+-------+-------------+
| alice |  10.0 |      5      |
|  bob  |  20.0 |      3      |
| carol |  30.0 |      5      |
| dave  |  40.0 |      4      |
|  eve  |  50.0 |      3      |
+-------+-------+-------------+

Bunu PySpark kullanarak databricks not defterinde uygulamak için:

from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType

@udf(returnType=IntegerType())
def get_name_length(name):
   return len(name)

df = df.withColumn("name_length", get_name_length(df.name))

# Show the result
display(df)

Daha fazla bilgi için bkz . Unity Kataloğu'nda Kullanıcı tanımlı işlevler (UDF) ve Kullanıcı tanımlı skaler işlevler - Python.

Kullanıcı tanımlı toplam işlevleri (UDAF)

Kullanıcı tanımlı toplama işlevleri (UDAFs) birden çok satırda çalışır ve tek bir toplu sonuç döndürür. Aşağıdaki örnekte, puanları toplayan bir UDAF tanımlanmıştır.

from pyspark.sql.functions import pandas_udf
from pyspark.sql import SparkSession
import pandas as pd

# Define a pandas UDF for aggregating scores
@pandas_udf("int")
def total_score_udf(scores: pd.Series) -> int:
    return scores.sum()

# Group by name length and aggregate
result_df = (df.groupBy("name_length")
              .agg(total_score_udf(df["score"]).alias("total_score")))

display(result_df)
+-------------+-------------+
| name_length | total_score |
+-------------+-------------+
|      3      |     70.0    |
|      4      |     40.0    |
|      5      |     40.0    |
+-------------+-------------+

Bkz . Python için pandas kullanıcı tanımlı işlevler ve Kullanıcı tanımlı toplama işlevleri - Scala.

Python kullanıcı tanımlı tablo işlevleri (UDF)

Önemli

Bu özellik Genel Önizlemededir.

Not

Python UDF'leri Databricks Runtime 14.3 LTS ve üzerinde kullanılabilir.

Python kullanıcı tanımlı tablo işlevleri (UDF'ler), her giriş satırı için birden çok satır ve sütun döndürebilir. Aşağıdaki örnekte, puan sütunundaki her değer bir kategori listesine karşılık gelir. Virgülle ayrılmış listeyi birden çok satıra bölmek için UDTF tanımlanır. Bkz. Python kullanıcı tanımlı tablo işlevleri (UDF)

+-------+-------+-----------------+
| name  | score |   categories    |
+-------+-------+-----------------+
| alice |  10.0 |  math,science   |
|  bob  |  20.0 |  history,math   |
| carol |  30.0 | science,history |
| dave  |  40.0 |    math,art     |
|  eve  |  50.0 |  science,art    |
+-------+-------+-----------------+

from pyspark.sql.functions import udtf

@udtf(returnType="score: int, categories: string, name: string")
class ScoreCategoriesUDTF:
    def eval(self, name: str, score: float, categories: str):
        category_list = categories.split(',')
        for category in category_list:
            yield (name, score, category)

# Apply the UDTF
result_df = df.select(ScoreCategoriesUDTF(df.score, df.categories, df.name))
display(result_df)
+-------+-------+----------+
| name  | score | category |
+-------+-------+----------+
| alice |  10.0 |   math   |
| alice |  10.0 | science  |
|  bob  |  20.0 | history  |
|  bob  |  20.0 |   math   |
| carol |  30.0 | science  |
| carol |  30.0 | history  |
| dave  |  40.0 |   math   |
| dave  |  40.0 |   art    |
|  eve  |  50.0 | science  |
|  eve  |  50.0 |   art    |
+-------+-------+----------+

Performansla ilgili dikkat edilmesi gerekenler

  • Yerleşik işlevler ve SQL UDF'leri en verimli seçenektir.
  • Scala UDF'leri , Java Sanal Makinesi (JVM) içinde yürütürken genellikle daha hızlıdır ve verileri JVM'ye ve JVM'den dışarı taşıma yükünden kaçınır.
  • Python UDF'leri ve Pandas UDF'leri , verilerin serileştirilmesini ve JVM'den Python yorumlayıcısına taşınmasını gerektirdiğinden Scala UDF'lerinden daha yavaş olma eğilimindedir. Serileştirme maliyetlerini azaltmak için Apache Arrow kullandıklarından Pandas UDF'leri Python UDF'lerinden 100 kat daha hızlıdır.