Aracılığıyla paylaş


Unity Kataloğu'nda kullanıcı tanımlı işlevler (UDF)

Önemli

Bu özellik Genel Önizlemededir.

Azure Databricks, Unity Kataloğu tarafından yönetilen şemalara özel işlevleri kaydetmek için SQL'e özel bir söz dizimi sağlar. Unity Kataloğu'nda işlev olarak kaydedilen Python UDF'lerinin kapsamı ve desteği, kapsamı not defteri veya SparkSession olan PySpark UDF'lerinden farklıdır. Bkz . Kullanıcı tanımlı skaler işlevler - Python.

TAM SQL dil başvurusu için bkz . CREATE FUNCTION (SQL ve Python).

Unity Kataloğu'un işlevler üzerindeki izinleri nasıl yönettiği hakkında bilgi için bkz . CREATE FUNCTION.

Gereksinimler

  • Databricks Runtime 13.3 LTS veya üzeri.
  • Unity Kataloğu'nda kayıtlı UDF'lerde Python kodunu kullanmak için sunucusuz veya profesyonel bir SQL ambarı ya da Databricks Runtime 13.3 LTS veya üzerini çalıştıran bir küme kullanmanız gerekir.
  • Unity Kataloğu'na kayıtlı bir UDF kullanılarak oluşturulan görünümleri çözümlemek için sunucusuz veya profesyonel bir SQL ambarı kullanmanız gerekir.

Unity Kataloğu'nda özel SQL işlevleri

Unity Kataloğu için yapılandırılmış işlemi kullanarak bir SQL işlevi oluşturduğunuzda, işlev varsayılan olarak etkin olan şemaya kaydedilir. Aşağıdaki örnek, yeni bir işlev için hedef katalog ve şema bildirmek için kullanabileceğiniz söz dizimini gösterir:

CREATE FUNCTION target_catalog.target_schema.roll_dice()
    RETURNS INT
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    COMMENT 'Roll a single 6 sided die'
    RETURN (rand() * 6)::INT + 1;

İşlevde yeterli ayrıcalıklara sahip tüm kullanıcılar, aşağıdaki örnekte olduğu gibi Unity Kataloğu için yapılandırılmış işlem ortamlarında işlevini kullanabilir:

SELECT target_catalog.target_schema.roll_dice()

Not

kullanarak UDF'leri LANGUAGE SQL kullanarak tabloları veya skaler değerleri döndürebilirsiniz.

Python UDF'yi Unity Kataloğu'na kaydetme

Databricks Runtime 13.3 LTS ve üzerinde, skaler Python UDF'lerini Unity Kataloğu'na kaydetmek için SQL CREATE FUNCTION deyimini kullanabilirsiniz.

Önemli

Unity Kataloğu için Python UDF'lerini yalnızca profesyonel ve sunucusuz SQL ambarları destekler.

Python UDF'leri doğrudan SQL işlevleri içinde Python'ın tam ifadesini sağlayacak şekilde tasarlanmıştır ve gelişmiş dönüştürmeler, veri maskeleme ve karma oluşturma gibi özelleştirilmiş işlemlere olanak sağlar.

Python UDF'leri güvenli, yalıtılmış bir ortamda yürütülür ve dosya sistemlerine veya iç hizmetlere erişimi yoktur.

Sunucusuz işlemde veya paylaşılan erişim modunda çalışan Python UDF'leri 80, 443 ve 53 numaralı bağlantı noktaları üzerinden TCP/UDP ağ trafiğine izin verir.

Bkz . Hangi UDF'ler en verimlidir?.

Not

Unity Kataloğu'nda Python UDF'leri için söz dizimi ve semantik, SparkSession'a kayıtlı Python UDF'lerinden farklıdır. Bkz . Kullanıcı tanımlı skaler işlevler - Python.

Unity Kataloğu için Python UDF'leri, aşağıdaki kod örneğinde olduğu gibi çift dolar işaretleri ()$$ ile ayarlanan deyimleri kullanır:

CREATE FUNCTION target_catalog.target_schema.greet(s STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
  return f"Hello, {s}"
$$

Aşağıdaki örnekte, adlı studentstablonun sütununda depolanan first_name tüm adların selamlama deyimlerini döndürmek için bu işlevin kullanılması gösterilmektedir:

SELECT target_catalog.target_schema.greet(first_name)
FROM students;

Python UDF içinde istediğiniz sayıda Python işlevi tanımlayabilirsiniz, ancak skaler değer döndürmeniz gerekir.

Python işlevlerinin değerleri bağımsız olarak işlemesi NULL ve tüm tür eşlemelerinin Azure Databricks SQL dil eşlemelerini izlemesi gerekir.

Azure Databricks tarafından eklenen standart Python kitaplıklarını içeri aktarabilirsiniz, ancak özel kitaplıklar veya dış bağımlılıklar içeremezsiniz.

Katalog veya şema belirtilmezse, Python UDF'leri geçerli etkin şemaya kaydedilir.

Aşağıdaki örnek bir kitaplığı içeri aktarır ve Python UDF içinde birden çok işlev kullanır:

CREATE FUNCTION roll_dice(num_dice INTEGER, num_sides INTEGER)
RETURNS INTEGER
LANGUAGE PYTHON
AS $$
  import numpy as np

  def roll_die(num_sides):
    return np.random.randint(num_sides) + 1

  def sum_dice(num_dice,num_sides):
    return sum([roll_die(num_sides) for x in range(num_dice)])

  return sum_dice(num_dice, num_sides)
$$