用戶自定義標量函數- Scala
本文包含Scala用戶定義函數(UDF)的例子。它顯示了如何注冊udf,如何調用udf,關於評價子表達式的順序在火花SQL警告。看到用戶自定義標量函數(udf)為更多的細節。
使用UDF DataFrames
進口org。apache。火花。sql。功能{。上校,udf}瓦爾的平方=udf((年代:長)= >年代*年代)顯示(火花。範圍(1,20.)。選擇(的平方(上校(“id”))作為“id_squared”))
評估順序和null檢查
火花SQL(包括SQL數據集和DataFrame api)並不能保證評價的子表達式。特別是,操作員的輸入或函數不一定是評估從左到右或任何其他固定順序。例如,邏輯和
和或
沒有從左到右的“短路”的語義表達。
因此,依靠是危險的副作用或布爾表達式的評價順序,和秩序在哪裏
和有
條款,因為這樣的表情和條款可以被重新排序在查詢優化和規劃。具體來說,如果一個UDF依賴短路語義在SQL進行null檢查,不能保證零之前檢查會發生調用UDF。例如,
火花。udf。注冊(“strlen”,(年代:字符串)= >年代。長度)火花。sql(“選擇從test1年代不是零和strlen (s) > 1”)/ /不能保證
這在哪裏
條款不保證strlen
UDF調用後過濾null。
執行適當的null檢查,我們建議你做以下:
讓UDF本身null-aware和做空檢查內部UDF本身
使用
如果
orgydF4y2Ba情況下當
表達式進行null檢查和調用UDF條件分支
火花。udf。注冊(“strlen_nullsafe”,(年代:字符串)= >如果(年代! =零)年代。長度其他的- - - - - -1)火花。sql(“選擇從test1年代不是零和strlen_nullsafe (s) > 1”)/ /好吧火花。sql(“從test1如果選擇s (s not null, strlen (s), null) > 1”)/ /好吧