用戶自定義標量函數- Scala

本文包含Scala用戶定義函數(UDF)的例子。它顯示了如何注冊udf,如何調用udf,關於評價子表達式的順序在火花SQL警告。看到用戶自定義標量函數(udf)為更多的細節。

注冊一個函數作為一個UDF

瓦爾的平方=(年代:)= >{年代*年代}火花udf注冊(“廣場”,的平方)

在火花SQL調用UDF

火花範圍(1,20.)。createOrReplaceTempView(“測試”)
%sql選擇id,廣場(id)作為id_squared測試

使用UDF DataFrames

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

評估順序和null檢查

火花SQL(包括SQL數據集和DataFrame api)並不能保證評價的子表達式。特別是,操作員的輸入或函數不一定是評估從左到右或任何其他固定順序。例如,邏輯沒有從左到右的“短路”的語義表達。

因此,依靠是危險的副作用或布爾表達式的評價順序,和秩序在哪裏條款,因為這樣的表情和條款可以被重新排序在查詢優化和規劃。具體來說,如果一個UDF依賴短路語義在SQL進行null檢查,不能保證零之前檢查會發生調用UDF。例如,

火花udf注冊(“strlen”,(年代:字符串)= >年代長度)火花sql(“選擇從test1年代不是零和strlen (s) > 1”)/ /不能保證

在哪裏條款不保證strlenUDF調用後過濾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”)/ /好吧