用戶定義標量函數- Scala

本文包含Scala用戶定義函數(UDF)示例。它展示了如何注冊udf,如何調用udf,以及在Spark SQL中關於子表達式求值順序的注意事項。看到用戶定義標量函數(udf)為更多的細節。

將函數注冊為UDF

瓦爾的平方年代= >年代年代火花udf注冊“廣場”的平方

調用Spark SQL中的UDF

火花範圍120.).createOrReplaceTempView“測試”
sql選擇id廣場id作為id_squared測驗

在數據框架中使用UDF

進口orgapache火花sql功能{。上校udf瓦爾的平方udf((年代= >年代年代顯示火花範圍120.).選擇的平方上校“id”))作為“id_squared”))

求值順序和空值檢查

Spark SQL(包括SQL、DataFrame和Dataset api)不保證子表達式的求值順序。特別是,運算符或函數的輸入不一定是從左向右求值或以任何其他固定的順序求值。例如,邏輯而且表達式沒有從左到右的“短路”語義。

因此,依賴於布爾表達式的求值順序或副作用是危險的在哪裏而且子句,因為這樣的表達式和子句可以在查詢優化和規劃期間重新排序。具體來說,如果UDF依賴SQL中的短路語義進行空檢查,則不能保證在調用UDF之前進行空檢查。例如,

火花udf注冊“strlen”年代字符串= >年代長度火花sql"select s from test1 where s不是null and strlen(s) >為1"/ /不能保證

在哪裏條款不保證strlen在過濾空值之後調用的UDF。

要執行正確的空檢查,我們建議您執行以下任一操作:

  • 使UDF本身具有空感知能力,並在UDF本身內部執行空檢查

  • 使用如果orgydF4y2Ba情況下表達式執行空檢查並在條件分支中調用UDF

火花udf注冊“strlen_nullsafe”年代字符串= >如果年代! =年代長度其他的-1火花sql"select s from test1 where s不是null and strlen_nullsafe(s) > 1"/ /好吧火花sql"select s from test1 where if(s is not null, strlen(s), null) > 1"/ /好吧