Unity Kataloğu'nda Scala ve Java kullanıcı tanımlı işlevleri (UDF'ler)

Bu sayfa, Scala ve Java kullanıcı tanımlı işlevlerinin (UDF'lerin) nasıl oluşturulacağını, Unity Catalog'a nasıl kaydedileceğini ve işlem ortamları arasında nasıl paylaşılacağını açıklar. Unity Kataloğu UDF'leri, Unity Kataloğu idaresi ve erişim denetimleriyle mevcut JVM mantığını yeniden kullanmanıza olanak tanır.

Tek bir not defteri veya kümeyle sınırlı oturum kapsamlı Scala UDF'lerinin aksine, Unity Kataloğu'nda kayıtlı UDF'ler şunlardır:

  • İdare: Unity Kataloğu izinleri ve erişim denetimleriyle yönetilir.
  • Yeniden kullanılabilir: Ekipler, not defterleri, işler ve SQL ambarları arasında paylaşılır.
  • Bulunabilir: Katalog Gezgini'nde ve sistem tablolarında görünür.
  • Yalıtılmış: Sandbox’larda çalışır; oturum başına tek seferlik bir soğuk başlangıç maliyeti vardır. Sonraki çağrılar hızlıdır.

Requirements

Unity Kataloğu için çalışma alanınızın etkinleştirilmesi gerekir. Aşağıdaki ek gereksinimler geçerlidir.

İşlem: Sunucusuz not defterleri ve işleri, SQL ambarları ve Lakeflow üzerinde Spark Bildirimli İşlem Hatları dahil olmak üzere tüm işlem türleri desteklenir. Klasik işlem için Databricks Runtime 18.2 veya üzeri gerekir. Sunucusuz işlem ve SQL ambarlarında UDF tanımının alanda Ortam Sürüm 4 veya üzerini belirtmesi environment_version gerekir. Bu gereksinim, UDF tanımı için geçerlidir; çağrıyı yapan not defteri veya görev için değil. bkz. Sunucusuz ortam sürümleri.

Geliştirme:

  • Scala: 2.13.16. Scala 2.12 desteklenmez.
  • JDK: 17.
  • Paketleme: UDF tarafından kullanılan tüm üçüncü taraf bağımlılıklarını içeren şişman bir JAR.

İzinler:

  • Şemada USAGE ve CREATE FUNCTION, katalogda ise USAGE olacak şekilde bir UDF oluşturun.
  • Bir UDF çalıştırın: işlev üzerinde EXECUTE, şema ve katalog üzerinde USAGE.
  • JAR dosyasına erişin: READ VOLUME JAR dosyasının depolandığı birimde.

Unity Kataloğu izinleri hakkında daha fazla bilgi için bkz. Unity Kataloğu'nda ayrıcalıkları yönetme .

UDF JAR'ınızı oluşturma

Derlenmiş kodunuzu JAR olarak paketleyin ve UDF'yi kaydetmeden önce Unity Kataloğu birimine yükleyin. Bir derleme yöntemi seçin:

Yerel olarak derleyin

Yerel geliştirme ortamında bir fat JAR oluşturmak için aşağıdaki adımları izleyin.

Ortamınızı ayarlama

Gerekli araçları yerel makinenize yükleyin. MacOS için aşağıdaki komutlar vardır. Diğer platformlar için platformunuzun paket yöneticisini kullanarak JDK 17 ve sbt (Scala) veya Maven (Java) yükleyin.

Scala

JDK 17 ve sbt'yi yükleyin:

brew install openjdk@17
brew install sbt

Yüklemenizi doğrulayın:

java -version   # Should show Java 17
sbt --version   # Should show sbt version

Java

JDK 17 ve Maven'ı yükleyin:

brew install openjdk@17
brew install maven

Yüklemenizi doğrulayın:

java -version   # Should show Java 17
mvn --version   # Should show Maven version

Projenizi oluşturma

Scala'da veya Java bir proje ayarlayın.

Scala

kullanarak sbtyeni bir Scala projesi oluşturun:

sbt new scala/scala-seed.g8

İstendiğinde, bir proje adı girin (örneğin, my-udf-project).

build.sbt'yi yapılandırma

Dosyanızın build.sbt içeriğini aşağıdaki yapılandırmayla değiştirin:

scalaVersion := "2.13.16"

ThisBuild / organization := "com.example"

lazy val myUDF = (project in file("."))
  .settings(
    name := "my-udf"
  )

sbt-assembly eklentisini etkinleştirme

Oluşturun veya düzenleyin project/assembly.sbt ve ekleyin:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")

Bu eklenti, tüm bağımlılıklarınızı içeren bir fat JAR dosyası oluşturur.

Java

Hızlı başlangıç arketipini kullanarak yeni bir Maven projesi oluşturun:

mvn archetype:generate \
  -DgroupId=com.example \
  -DartifactId=my-udf \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false

Bu komut, src/main/java ve src/test/java dizinleriyle standart Maven proje yapısını oluşturur.

pom.xml'yi yapılandırın

Oluşturulan pom.xml dosyada, etiketlerin <project></project> içine aşağıdaki yapılandırmaya sahip bir <properties> blok ekleyin:

<properties>
  <maven.compiler.source>17</maven.compiler.source>
  <maven.compiler.target>17</maven.compiler.target>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Ayrıca etiketlerin <project></project> içine aşağıdaki yapılandırmaya sahip bir <build> blok ekleyin:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.5.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

, maven-shade-plugin tüm bağımlılıklarınızı içeren bir fat JAR oluşturur.

UDF'nizi yazın

UDF'nizi yazarken Scala ve Java türlerinin SQL türleriyle nasıl eşlendiğine bakmak için desteklenen veri türleri için veri türleri ve Dil eşlemeleri bölümüne bakın.

UDF işleyiciniz aşağıdaki gereksinimleri karşılamalıdır:

  • Scala: İşleyiciyi bir object üzerinde yöntem olarak tanımlayın (class olarak değil). HANDLER değeri, bir Scala object üzerindeki bir yönteme karşılık gelir.
  • Java: İşleyiciyi yöntem public static olarak tanımlayın.
  • İmza: Yöntemin parametre türleri, sırası ve dönüş türü, bağımsız değişken listesiyle ve CREATE FUNCTION deyiminizdeki RETURNS türüyle eşleşmelidir.
  • Yalnızca skaler: İşleyicinin tek bir skaler değer döndürmesi gerekir. Tablo dönüş türleri desteklenmez.
  • Bağımsız: İşleyicinin yalnızca giriş bağımsız değişkenleri üzerinde çalışması gerekir. Spark API'lerini kullanamaz veya Spark çekirdek paketlerine bağımlıdır. Bkz. Sınırlamalar.

Note

Scala için, ilkel bir parametre türüne sahip bir işleyici (örneğin Int), herhangi bir giriş bağımsız değişkeni SQL NULL olduğunda atlanır ve NULL döndürülür. NULL değerlerini almak ve işlemek için parametreyi Option içine alın; örneğin Option[Int].

Scala

içinde src/main/scala/com/example/MyUDF.scala bir Scala nesnesi oluşturun ve UDF işlevinizi tanımlayın.

Temel örnek

package com.example

object MyUDF {
  def addOne(x: Int): Int = x + 1
}

Dış bağımlılık örneği

Dış kitaplıkları kullanmak için bunları dosyanıza build.sbt ekleyin:

scalaVersion := "2.13.16"

ThisBuild / organization := "com.example"

lazy val myUDF = (project in file("."))
  .settings(
    name := "currency-udf",
    libraryDependencies ++= Seq(
      "org.apache.commons" % "commons-lang3" % "3.12.0"
    )
  )

Ardından UDF'nizdeki bağımlılığı kullanın:

package com.example

import org.apache.commons.lang3.StringUtils

object CurrencyUDF {
  private val rates: Map[String, Double] = Map(
    "USD" -> 1.0,
    "EUR" -> 1.1,
    "GBP" -> 1.3,
    "JPY" -> 0.007
  )

  def convertToUSD(price: Double, currency: String): Double = {
    require(currency != null, "Currency must not be null")

    val normalizedCurrency = StringUtils.upperCase(currency)

    rates.get(normalizedCurrency) match {
      case Some(rate) => price * rate
      case None => throw new IllegalArgumentException(s"Unsupported currency: $currency")
    }
  }
}

Dağıtmadan önce birim testleriyle UDF'nizi test edin. Bkz . UDF'leri yerel olarak test etme.

Java

içinde src/main/java/com/example/MyUDF.java bir Java sınıfı oluşturun ve UDF'nizi genel statik yöntem olarak tanımlayın.

Temel örnek

package com.example;

public class MyUDF {
    public static int addOne(int x) {
        return x + 1;
    }
}

Dış bağımlılık örneği

Dış kitaplıkları kullanmak için bunları pom.xml dosyanızın <dependencies> bölümüne ekleyin:

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
</dependencies>

Ardından UDF'nizdeki bağımlılığı kullanın:

package com.example;

import org.apache.commons.lang3.StringUtils;
import java.util.Map;
import java.util.HashMap;

public class CurrencyUDF {
    private static final Map<String, Double> rates = new HashMap<>();

    static {
        rates.put("USD", 1.0);
        rates.put("EUR", 1.1);
        rates.put("GBP", 1.3);
        rates.put("JPY", 0.007);
    }

    public static double convertToUSD(double price, String currency) {
        if (currency == null) {
            throw new IllegalArgumentException("Currency must not be null");
        }

        String normalizedCurrency = StringUtils.upperCase(currency);

        if (!rates.containsKey(normalizedCurrency)) {
            throw new IllegalArgumentException("Unsupported currency: " + currency);
        }

        return price * rates.get(normalizedCurrency);
    }
}

Dağıtmadan önce birim testleriyle UDF'nizi test edin. Bkz . UDF'leri yerel olarak test etme.

Note

UDF'niz, aktif Spark oturumu bulunmayan yalıtılmış bir sandbox ortamında çalışır; bu nedenle işlev gövdesinden Spark API'lerini kullanamaz. Örneğin, DataFrame'ler veya Veri Kümeleri oluşturamaz ya da bunlar üzerinde işlem yapamaz, spark.sql(...) çalıştıramaz veya SparkSession ya da SparkContext öğelerine erişemezsiniz. UDF, girdi bağımsız değişkenleri üzerinde çalışan kendi içinde yeterli bir mantık içermelidir. Ayrıca Spark çekirdek paketlerine de bağımlı değildir.

fat JAR dosyanızı oluşturun

Tüm bağımlılıkları içeren bir yağ JAR'ı oluşturmak için projenizi oluşturun.

Scala

Proje kök dizininizden şunu çalıştırın:

sbt clean assembly

Fat JAR dosyası, target/scala-2.13/ içinde my-udf-assembly-0.1.0-SNAPSHOT.jar gibi bir adla oluşturulur.

Java

Proje kök dizininizden şunu çalıştırın:

mvn clean package

Fat JAR dosyası, target/ içinde my-udf-1.0-SNAPSHOT.jar gibi bir adla oluşturulur.

JAR'ınızı Unity Kataloğu birimine yükleme

Zaten bir Unity Catalog biriminiz yoksa, bir tane oluşturun:

CREATE VOLUME IF NOT EXISTS my_catalog.my_schema.udf_jars
COMMENT 'Storage for UDF JAR files';

Diğer kullanıcıların UDF'yi çalıştırması gerekiyorsa, onlara READ VOLUME birim üzerinde verin:

GRANT READ VOLUME ON VOLUME my_catalog.my_schema.udf_jars TO `user@example.com`;

Katalog Gezgini'ni kullanarak JAR dosyanızı birime yükleyin:

  1. Azure Databricks çalışma alanınızda katalog gezginini açmak için Data icon.Catalog öğesine tıklayın.
  2. Kataloğu seçin ve ardından biriminizi içeren şemayı seçin.
  3. Birim adına tıklayın.
  4. Bu birime yükle'ye tıklayın ve JAR dosyanızı seçin.
  5. Yükle'ye tıklayın.
  6. Yükleme tamamlandıktan sonra JAR dosyanızın adına tıklayın.
  7. Birim yolunu panonuza kopyalamak için Yolu kopyala'ya tıklayın. Örneğin, /Volumes/my_catalog/my_schema/udf_jars/my-udf-assembly-0.1.0-SNAPSHOT.jar (Scala) veya /Volumes/my_catalog/my_schema/udf_jars/my-udf-1.0-SNAPSHOT.jar (Java). UDF'yi kaydederken bu yola ihtiyacınız vardır.

Notebook'ta derleme yapın

UDF'yi derleyebilir, JAR olarak paketleyebilir ve doğrudan bir Azure Databricks not defterinden Unity Kataloğu birimine yükleyebilirsiniz. Bu yaklaşım küçük, bağımlılık içermeyen UDF'ler için çalışır. Üçüncü taraf kitaplıkları içeren UDF'ler için Yerel olarak derle seçeneğini kullanın.

Aşağıdaki Python kod hücresi, bir dizeyi temizleyen (başındaki ve sonundaki boşlukları kaldıran, yinelenen boşlukları tek boşluğa indiren ve küçük harfe dönüştüren) bir Java UDF’si yazar, bunu JDK 17 ile derler, JAR olarak paketler ve Unity Catalog birimine kopyalar. volume_path öğesini, üzerinde WRITE VOLUME izninizin bulunduğu mevcut bir birimi gösterecek şekilde güncelleştirin.

import os
import subprocess
import shutil

build_dir = "/tmp/udf_build"
package_dir = f"{build_dir}/src/com/databricks/udf"
classes_dir = f"{build_dir}/classes"
os.makedirs(package_dir, exist_ok=True)
os.makedirs(classes_dir, exist_ok=True)

# The UDF handler: a public static method on a plain Java class.
# The doubled backslashes produce a single backslash in the Java source (\\s+).
udf_code = """package com.databricks.udf;
public class StringCleanUDF {
    public static String clean(String input) {
        if (input == null) return null;
        return input.trim().replaceAll("\\\\s+", " ").toLowerCase();
    }
}
"""
with open(f"{package_dir}/StringCleanUDF.java", "w") as f:
    f.write(udf_code)

# Compile with JDK 17 to match Environment Version 4.
subprocess.run(
    ["javac", "--release", "17", "-d", classes_dir, f"{package_dir}/StringCleanUDF.java"],
    check=True,
)

# Package the compiled class into a JAR.
jar_path = f"{build_dir}/string_clean_udf.jar"
subprocess.run(["jar", "cf", jar_path, "-C", classes_dir, "."], check=True)

# Copy the JAR to a Unity Catalog volume.
volume_path = "/Volumes/my_catalog/my_schema/udf_jars/string_clean_udf.jar"
os.makedirs(os.path.dirname(volume_path), exist_ok=True)
shutil.copy2(jar_path, volume_path)

print(f"JAR uploaded to: {volume_path}")

JAR birimde yer aldıktan sonra UDF'yi kaydedin. LANGUAGE JAVA kullanın ve HANDLER değerini, com.databricks.udf.StringCleanUDF.clean gibi tam nitelikli yöntem adına ayarlayın.

UDF'nizi Unity Kataloğu'nda kaydetme

JAR'ınızı oluşturup yükledikten sonra, UDF'nizi Unity Catalog'a kaydetmek için CREATE FUNCTION deyimini kullanın.

Scala

CREATE OR REPLACE FUNCTION my_catalog.my_schema.add_one(x INT)
RETURNS INT
LANGUAGE SCALA
DETERMINISTIC
ENVIRONMENT (
  java_dependencies = '["/Volumes/my_catalog/my_schema/udf_jars/my-udf-assembly-0.1.0-SNAPSHOT.jar"]',
  environment_version = '4'
)
HANDLER 'com.example.MyUDF.addOne';

Java

CREATE OR REPLACE FUNCTION my_catalog.my_schema.add_one(x INT)
RETURNS INT
LANGUAGE JAVA
DETERMINISTIC
ENVIRONMENT (
  java_dependencies = '["/Volumes/my_catalog/my_schema/udf_jars/my-udf-1.0-SNAPSHOT.jar"]',
  environment_version = '4'
)
HANDLER 'com.example.MyUDF.addOne';

deyimi CREATE FUNCTION aşağıdaki parametreleri kullanır:

  • LANGUAGE: UDF'nin dili.

  • HANDLER: Yöntemin tam yolu, 'package.Object.method' (Scala) veya 'package.ClassName.method' (Java) biçiminde.

  • DETERMINISTIC: İşlevin her zaman aynı giriş için aynı çıkışı döndürdüğünü bildirir ve sorgu iyileştirmeyi etkinleştirir.

    Note

    İşleviniz dış API'leri çağırıyorsa veya başka bir belirleyici olmayan davranışa sahipse kaldırın DETERMINISTIC .

  • ENVIRONMENT: UDF için yürütme ortamını tanımlar.

    • java_dependencies: Unity Kataloğu birimlerinizdeki JAR dosya yollarının JSON dizisi. Bu, önceki adımda kopyaladığınız dosya yoludur. Dizi etrafında tek tırnak ve yolların çevresinde çift tırnak kullanın.
    • environment_version: Scala ve Java UDF'leri için '4' veya üzeri olmalıdır. Ortam Sürüm 4, Scala 2.13.16 ve JDK 17'i belirtir. bkz. Sunucusuz ortam sürümleri.

SQL ve not defterlerinde UDF'nizi çağırma

Kayıt sonrasında SQL sorgularında, not defterlerinde ve görünümlerde UDF'yi çağırabilirsiniz:

-- Simple select
SELECT my_catalog.my_schema.add_one(5) AS result;

-- With table data
SELECT
  id,
  price,
  currency,
  my_catalog.my_schema.convert_to_usd(price, currency) AS price_usd
FROM my_catalog.my_schema.transactions;

-- Filtering
SELECT *
FROM my_catalog.my_schema.products
WHERE my_catalog.my_schema.convert_to_usd(price, currency) > 100;

-- Aggregation
SELECT
  category,
  SUM(my_catalog.my_schema.convert_to_usd(price, currency)) AS total_usd
FROM my_catalog.my_schema.sales
GROUP BY category;

İdare ve paylaşım

UDF'nizi kimlerin çalıştırabileceğini denetlemek ve kuruluşunuz genelinde bulunabilir hale getirmek için Unity Kataloğu izinlerini kullanın.

İzin verme

Diğer kullanıcıların UDF'lerinizi çalıştırması için gerekli izinleri vermek için Katalog Gezgini'ni veya SQL'i kullanın.

Katalog Tarayıcısı

  1. Kenar çubuğunda Veri simgesine tıklayın.Katalog'a gidin.
  2. Kataloğu ve ardından işlevinizi içeren şemayı seçin.
  3. İşlev adına tıklayın.
  4. İzinler sekmesinde Ver'e tıklayın.
  5. Erişim vermek istediğiniz sorumluları seçin ve izni seçin EXECUTE .
  6. Onayla'yı tıklatın.

SQL

Bir kullanıcıya veya gruba izin vermek EXECUTE için bir not defterinde veya Databricks SQL düzenleyicisinde aşağıdaki komutu çalıştırın.

-- Grant to a specific user
GRANT EXECUTE ON FUNCTION my_catalog.my_schema.add_one TO `user@example.com`;

-- Grant to a group
GRANT EXECUTE ON FUNCTION my_catalog.my_schema.add_one TO `data-engineers`;

İzinleri iptal etme

Diğer kullanıcıların izinlerini iptal etmek için Katalog Gezgini'ni veya SQL'i kullanın.

Katalog Tarayıcısı

  1. Kenar çubuğunda Veri simgesine tıklayın.Katalog'a gidin.
  2. Kataloğu ve ardından işlevinizi içeren şemayı seçin.
  3. İşlev adına tıklayın.
  4. İzinler sekmesinde, erişimi iptal etmek istediğiniz sorumlunun yanındaki onay kutusunu seçin. İptal Et'e tıklayın.
  5. Bildirimde İptal Et'e tıklayın.

SQL

Bir kullanıcı veya grubun izinlerini iptal EXECUTE etmek için bir not defterinde veya Databricks SQL düzenleyicisinde aşağıdaki komutu çalıştırın.

-- Revoke from specific user
REVOKE EXECUTE ON FUNCTION my_catalog.my_schema.add_one FROM `user@example.com`;

-- Revoke from a group
REVOKE EXECUTE ON FUNCTION my_catalog.my_schema.add_one FROM `data-engineers`;

UDF'leri bulma

Unity Kataloğu'nda yönetilen UDF'leri bulmak için, my_catalog ve my_schema değerlerini değiştirerek information_schema.routines tablosunu sorgulayın:

SELECT
  routine_catalog,
  routine_schema,
  routine_name,
  routine_definition,
  created
FROM system.information_schema.routines
WHERE routine_catalog = 'my_catalog'
  AND routine_schema = 'my_schema';

UDF'nizi güncelleştirme

Mevcut Unity Kataloğu UDF'sini yeni kodla güncelleştirmek için:

  1. Kodunuzda yerel olarak değişiklik yapın.
  2. JAR'yi yeni bir sürüm numarasıyla yeniden oluşturun.
    • Scala: sbt clean assembly (örneğin, my-udf-assembly-0.2.0-SNAPSHOT.jar)
    • Java: mvn clean package (örneğin, my-udf-2.0-SNAPSHOT.jar)
  3. Yeni JAR'ı Unity Kataloğu birimine yükleyin.
  4. UDF'yi güncelleştirmek için aynı işlev adıyla kullanın CREATE OR REPLACE FUNCTION . java_dependencies içinde en güncel JAR'ın kullanıldığını doğrulayın.

Azure Databricks sonraki çağrıda yeni kodu kullanır. Kümenizi yeniden başlatmanız gerekmez.

Performans iyileştirme

Soğuk başlatma gecikmesi

Bir oturumdaki ilk UDF çağrısı, yalıtılmış korumalı alanı başlatır ve bu da ek gecikmeye neden olur. Aynı oturumdaki sonraki çağrılar daha hızlıdır. Gecikme süresine duyarlı iş yüklerini kıyaslarken veya tasarlarken bunu hesap edin.

Pahalı hesaplamaları önbelleğe alma

UDF'niz pahalı başlatma veya hesaplama gerçekleştiriyorsa sonucu önbelleğe alın ve yalnızca bir kez hesaplayın.

Scala

Sonucu önbelleğe almak için Scala nesnesindeki bir val alanı kullanın:

package example

object CachedUDF {
  // Computed once and cached
  val expensiveData: Map[String, Double] = {
    // Load data from somewhere expensive
    Map("key1" -> 1.0, "key2" -> 2.0)
  }

  def lookup(key: String): Double = {
    expensiveData.getOrElse(key, 0.0)
  }
}

Java

static Sonucu önbelleğe almak için statik başlatıcı bloğuna sahip bir alan kullanın:

package example;

import java.util.Map;
import java.util.HashMap;

public class CachedUDF {
    // Computed once and cached
    private static Map<String, Double> expensiveData;

    static {
        // Load data from somewhere expensive
        expensiveData = new HashMap<>();
        expensiveData.put("key1", 1.0);
        expensiveData.put("key2", 2.0);
    }

    public static double lookup(String key) {
        return expensiveData.getOrDefault(key, 0.0);
    }
}

Uygun olduğunda DETERMINISTIC kullanma

UDF'nizi, aynı girdi için her zaman aynı çıktıyı üretiyorsa, DETERMINISTIC olarak işaretleyin. Bu, sorgu iyileştiricisinin sonuçları önbelleğe alıp performansı geliştirmesine olanak tanır.

Sınırlamalar

  • Yalnızca skaler UDF'ler desteklenir. Kullanıcı tanımlı toplama işlevleri (UDAF) ve kullanıcı tanımlı tablo işlevleri (UDF) desteklenmez.
  • UDF'ler, etkin bir Spark oturumu olmadan yalıtılmış bir korumalı alanda çalışır. Spark API'leri (SparkSession, SparkContext, spark.sql(...), DataFrame ve Veri Kümesi işlemleri) kullanılamaz.
  • UDF'ler Spark çekirdek paketlerine bağımlı olamaz.
  • UDF'lerin çalışma zamanında çalışma alanı dosyalarına veya Unity Kataloğu birimlerine erişimi yoktur.

En iyi uygulamalar

Databricks aşağıdaki uygulamaları önerir:

  • JAR dosyalarınızın sürümünü oluşturun. Örneğin, my-udf-0.1.0.jar, my-udf-0.2.0.jar.
  • Dağıtımdan önce SQL türü eşlemelerini doğrulayın. Bkz. Dil eşlemeleri.
  • READ VOLUME Ve EXECUTE izinlerini yalnızca UDF'yi çalıştırması gereken kullanıcılara verin. Ekipler arasında paylaşılan UDF'ler için grup sahipliğini kullanın.

UDF'leri yerel olarak test etme

Üretime dağıtmadan önce birim testleriyle UDF'nizi test edin.

Scala

src/main/scala/example/MyUDF.scala sınamak için, src/test/scala/example/MyUDFTest.scala içinde bir test dosyası oluşturun:

package example

import org.scalatest.funsuite.AnyFunSuite

class MyUDFTest extends AnyFunSuite {
  test("addOne should add 1 to input") {
    assert(MyUDF.addOne(5) == 6)
  }

  test("addOne should handle negative numbers") {
    assert(MyUDF.addOne(-1) == 0)
  }
}

Test bağımlılığını build.sbt öğesine ekleyin:

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % Test

Testleri çalıştırmak için:

sbt test

Java

src/main/java/com/example/MyUDF.java öğesini test etmek için, src/test/java/com/example/MyUDFTest.java içinde bir test dosyası oluşturun:

package com.example;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class MyUDFTest {
    @Test
    public void testAddOne() {
        assertEquals(6, MyUDF.addOne(5));
    }

    @Test
    public void testAddOneWithNegativeNumbers() {
        assertEquals(0, MyUDF.addOne(-1));
    }
}

JUnit bağımlılığını pom.xml dosyanızın <dependencies> bölümüne ekleyin:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.10.0</version>
    <scope>test</scope>
</dependency>

Testleri çalıştırmak için:

mvn test

Ek kaynaklar