Aracılığıyla paylaş


Kullanıcı tanımlı skaler işlevler - Scala

Bu makalede Scala kullanıcı tanımlı işlev (UDF) örnekleri yer alır. Spark SQL'de UDF'lerin nasıl kaydedilecekleri, UDF'lerin nasıl çağrılacakları ve alt ifadelerin değerlendirme sırasına ilişkin uyarılar gösterilir. Daha fazla ayrıntı için bkz. Dış kullanıcı tanımlı skaler işlevler (UDF).

Not

Unity Kataloğu etkinleştirilmiş hesaplama kaynaklarında paylaşılan erişim moduna sahip Scala UDF'leri için Databricks Runtime 14.2 ve üzeri gereklidir.

İşlevi UDF olarak kaydetme

val squared = (s: Long) => {
  s * s
}
spark.udf.register("square", squared)

Spark SQL'de UDF'yi çağırma

spark.range(1, 20).createOrReplaceTempView("test")
%sql select id, square(id) as id_squared from test

DataFrame'lerle UDF kullanma

import org.apache.spark.sql.functions.{col, udf}
val squared = udf((s: Long) => s * s)
display(spark.range(1, 20).select(squared(col("id")) as "id_squared"))

Değerlendirme sırası ve null denetimi

Spark SQL (SQL ve DataFrame ile Veri Kümesi API'leri dahil) alt ifadelerin değerlendirilme sırasını garanti etmez. Özellikle, bir işlecin veya işlevin girişleri mutlaka soldan sağa veya başka bir sabit sırada değerlendirilmez. Örneğin, mantıksal AND ve OR ifadelerde soldan sağa "kısa devre" semantiği yoktur.

Bu nedenle, boole ifadelerinin yan etkilerine veya değerlendirme sırasına ve ve WHERE yan tümcelerinin sırasına HAVING güvenmek tehlikelidir, çünkü bu ifadeler ve yan tümceler sorgu iyileştirme ve planlama sırasında yeniden sıralanabilir. Özellikle, bir UDF null denetim için SQL'de kısa devre semantiği kullanıyorsa, UDF'yi çağırmadan önce null denetimin gerçekleşeceğinin garantisi yoktur. Örneğin,

spark.udf.register("strlen", (s: String) => s.length)
spark.sql("select s from test1 where s is not null and strlen(s) > 1") // no guarantee

Bu WHERE yan tümce, null değerleri filtreledikten sonra UDF'nin çağrılacağı garanti strlen etmez.

Doğru null denetimi gerçekleştirmek için aşağıdakilerden birini yapmanızı öneririz:

  • UDF'nin kendisini null algılayan hale getirin ve UDF'nin içinde null denetimi yapın
  • Null denetimi yapmak ve koşullu dalda UDF'yi çağırmak için veya IF ifadelerini kullanın CASE WHEN
spark.udf.register("strlen_nullsafe", (s: String) => if (s != null) s.length else -1)
spark.sql("select s from test1 where s is not null and strlen_nullsafe(s) > 1") // ok
spark.sql("select s from test1 where if(s is not null, strlen(s), null) > 1")   // ok

Yazılan Veri Kümesi API'leri

Not

Bu özellik, Databricks Runtime 15.4 sonrası sürümlerde ve paylaşmalı erişim moduna sahip Unity Kataloğu etkin kümelerde desteklenir.

Yazılan Veri Kümesi API'leri, kullanıcı tanımlı bir işlevle elde edilen Veri Kümeleri üzerinde eşleme, filtre ve toplama gibi dönüştürmeleri çalıştırmanızı sağlar.

Örneğin, aşağıdaki Scala uygulaması map() API'sini kullanarak bir sonuç sütunundaki bir sayıyı ön ekli dizeye değiştirir.

spark.range(3).map(f => s"row-$f").show()

Bu örnekte API kullanılırkenmap(), bu durum , filter(), , mapPartitions()foreach()foreachPartition()ve reduce()gibi flatMap()diğer türdeki Veri Kümesi API'leri için de geçerlidir.