Aracılığıyla paylaş


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

Kullanıcı tanımlı işlev (UDF), kullanıcı tarafından tanımlanan ve özel mantığın kullanıcı ortamında yeniden kullanılmasına olanak sağlayan bir işlevdir. Azure Databricks, genişletilebilir mantığın dağıtılması için birçok farklı UDF türü desteğine sahiptir. Bu makalede UDF'lerin bazı genel güçlü yönleri ve sınırlamaları açıklanır.

Not

Azure Databricks'teki tüm yürütme ortamlarında tüm UDF biçimleri kullanılamaz. Unity Kataloğu ile çalışıyorsanız bkz . Unity Kataloğu'nda Kullanıcı tanımlı işlevler (UDF' ler).

Serileştirme cezaları olmadan özel mantık tanımlama

Azure Databricks, birçok UDF türüyle ilgili verimlilik sınırlamaları da dahil olmak üzere UDF davranışlarının çoğunu Apache Spark'tan devralır. Bkz . Hangi UDF'ler en verimlidir?.

UDF'lerle ilişkili olası verimlilik dengeleri konusunda endişelenmeden kodunuzu güvenli bir şekilde modülerleştirebilirsiniz. Bunu yapmak için mantığınızı SQL veya Spark DataFrames kullanarak bir dizi Spark yerleşik yöntemi olarak tanımlamanız gerekir. Örneğin, aşağıdaki SQL ve Python işlevleri, birim dönüştürmeyi yeniden kullanılabilir bir işlev olarak tanımlamak için Spark yerleşik yöntemlerini birleştirir:

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)

Yukarıdaki UDF'leri çalıştırmak için örnek veriler oluşturabilirsiniz.

En verimli UDF'ler hangileridir?

UDF'ler kod yürütmede önemli işlem sorunlarına neden olabilir. Azure Databricks, apache Spark, SQL ve Delta Lake söz dizimi ile yazılmış kodlar için otomatik olarak bir dizi farklı iyileştirici kullanır. UDF'ler tarafından özel mantık sunulduğunda, bu iyileştiriciler bu özel mantık etrafında görevleri verimli bir şekilde planlama yeteneğine sahip değildir. Ayrıca, JVM dışında yürütülen mantığın veri serileştirmesi ile ilgili ek maliyetleri vardır.

Not

Azure Databricks, Photon özellikli işlem kullanıyorsanız Photon kullanarak birçok işlevi iyileştirir. Yalnızca Spark SQL of DataFrame komutlarını birbirine zincirleyen işlevler Photon tarafından iyileştirilebilir.

Bazı UDF'ler diğerlerinden daha verimlidir. Performans açısından:

  • Yerleşik işlevler, Azure Databricks iyileştiricileri sayesinde en hızlı şekilde çalışır.
  • JVM'de yürütülen kod (Scala, Java, Hive UDF'leri) Python UDF'lerinden daha hızlı olacaktır.
  • Pandas UDF'leri Python UDF'leriyle ilişkili serileştirme maliyetlerini azaltmak için Ok kullanır.
  • Python UDF'leri yordam mantığı için iyi çalışır, ancak büyük veri kümelerindeki üretim ETL iş yükleri için kaçınılmalıdır.

Not

Databricks Runtime 12.2 LTS ve altında, paylaşılan erişim modunu kullanan kümelerde Unity Kataloğu'nda Python skaler UDF'leri ve Pandas UDF'leri desteklenmez. Bu UDF'ler tüm erişim modları için Databricks Runtime 13.3 LTS ve üzerinde desteklenir.

Databricks Runtime 14.1 ve altında Scala skaler UDF'ler, paylaşılan erişim modunu kullanan kümelerde Unity Kataloğu'nda desteklenmez. Bu UDF'ler Databricks Runtime 14.2 ve üzeri tüm erişim modları için desteklenir.

Databricks Runtime 13.3 LTS ve üzerinde SQL söz dizimlerini kullanarak skaler Python UDF'lerini Unity Kataloğu'na kaydedebilirsiniz. Bkz . Unity Kataloğu'nda Kullanıcı tanımlı işlevler (UDF' ler).

Tür İyileştirilmiş Yürütme ortamı
Hive UDF Hayır JVM
Python UDF Hayır Python
Pandas UDF Hayır Python (Ok)
Scala UDF Hayır JVM
Spark SQL Yes JVM (Foton)
Spark DataFrame Yes JVM (Foton)

Ne zaman UDF kullanmalısınız?

UDF'lerin önemli avantajlarından biri, kullanıcıların mantığı tanıdık dillerde ifade etmelerine olanak tanımaları ve kodu yeniden düzenlemeyle ilişkili insan maliyetini azaltmalarıdır. Geçici sorgular, el ile veri temizleme, keşif veri analizi ve küçük veya orta ölçekli veri kümelerindeki işlemlerin çoğu için UDF'lerle ilişkili gecikme ek yük maliyetlerinin kodu yeniden düzenlemeyle ilişkili maliyetlerden daha ağır basma olasılığı düşüktür.

ETL işleri, akış işlemleri, çok büyük veri kümelerindeki işlemler veya düzenli veya sürekli yürütülen diğer iş yükleri için, yerel Apache Spark yöntemlerini kullanmak için mantığı yeniden düzenleme, kar payı ödemelerini hızlı bir şekilde gerçekleştirir.

Örneğin UDF'ler için örnek veriler

Bu makaledeki kod örneklerinde, Celcius ile Farenheit arasındaki sıcaklıkları dönüştürmek için UDF'ler kullanılır. Bu işlevleri yürütmek isterseniz aşağıdaki Python koduyla örnek bir veri kümesi oluşturabilirsiniz:

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