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ınCASE 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.