用戶定義標量函數- Scala
本文包含Scala用戶定義函數(UDF)示例。它展示了如何注冊udf,如何調用udf,以及在Spark SQL中關於子表達式求值順序的注意事項。看到用戶定義標量函數(udf)為更多的細節。
在數據框架中使用UDF
進口org.apache.火花.sql.功能{。上校,udf}瓦爾的平方=udf((年代:長)= >年代*年代)顯示(火花.範圍(1,20.).選擇(的平方(上校(“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")/ /好吧