Megosztás a következőn keresztül:


Felhasználó által definiált skaláris függvények – Scala

Ez a cikk a Scala felhasználó által definiált függvényeinek (UDF) példáit tartalmazza. Bemutatja, hogyan regisztrálhatja az UDF-eket, hogyan hívhatja meg az UDF-eket, és a Spark SQL-ben az alexpressziók kiértékelési sorrendjével kapcsolatos kifogásokat. További részletekért tekintse meg a külső, felhasználó által definiált skaláris függvényeket (UDF-eket ).

Fontos

A Scala UDF-ek támogatása a unitykatalógus-kompatibilis fürtökön megosztott hozzáférési módban nyilvános előzetes verzióban érhető el, és a Databricks Runtime 14.2-s vagy újabb verziójára van szükség.

Megjegyzés:

Függvény regisztrálása UDF-ként

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

Az UDF meghívása a Spark SQL-ben

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

UDF használata DataFrame-ekkel

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

Kiértékelési sorrend és null ellenőrzés

A Spark SQL (beleértve az SQL-t és a DataFrame- és Adathalmaz API-kat) nem garantálja az alexpressziók kiértékelésének sorrendjét. Az operátorok vagy függvények bemeneteit nem feltétlenül értékelik ki balról jobbra vagy más rögzített sorrendben. A logikai AND és OR kifejezési kifejezések például nem rendelkeznek balról jobbra "rövidzárolás" szemantikával.

Ezért veszélyes a logikai kifejezések mellékhatásaira vagy kiértékelési sorrendjére, valamint a záradékok sorrendjére WHEREHAVING támaszkodni, mivel az ilyen kifejezések és záradékok átrendezhetők a lekérdezésoptimalizálás és -tervezés során. Pontosabban, ha egy UDF az SQL rövidzárlatú szemantikára támaszkodik a nullellenőrzéshez, nincs garancia arra, hogy a null ellenőrzés az UDF meghívása előtt fog történni. Példa:

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

Ez a WHERE záradék nem garantálja az UDF meghívását a strlen null értékek szűrése után.

A megfelelő nullellenőrzés végrehajtásához az alábbiak valamelyikét javasoljuk:

  • Állítsa az UDF-et nullérzékenysé, és végezze el a null ellenőrzést magában az UDF-ben
  • CASE WHEN Null-ellenőrzés vagy kifejezések használata IF és az UDF meghívása feltételes ágban
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