用戶自定義標量函數——Python

本文包含Python用戶定義函數(UDF)的例子。它顯示了如何注冊udf,如何調用udf,提供關於評價子表達式的順序在火花SQL警告。

請注意

Python UDF和UDAF(用戶定義的聚合函數)不支持集群統一目錄,使用共享訪問模式。

注冊一個函數作為一個UDF

def的平方(年代):返回年代*年代火花udf注冊(“squaredWithPython”,的平方)

你可以設置你的UDF返回類型。默認的返回類型StringType

pyspark.sql.types進口LongTypedefsquared_typed(年代):返回年代*年代火花udf注冊(“squaredWithPython”,squared_typed,LongType())

在火花SQL調用UDF

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

使用UDF DataFrames

pyspark.sql.functions進口udfpyspark.sql.types進口LongTypesquared_udf=udf(的平方,LongType())df=火花(“測試”)顯示(df選擇(“id”,squared_udf(“id”)別名(“id_squared”)))

或者,您可以聲明相同的UDF使用注釋的語法:

pyspark.sql.functions進口udf@udf(“長”)defsquared_udf(年代):返回年代*年代df=火花(“測試”)顯示(df選擇(“id”,squared_udf(“id”)別名(“id_squared”)))

評估順序和null檢查

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

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

火花udf注冊(“strlen”,λ年代:len(年代),“int”)火花sql(“選擇從test1年代不是零和strlen (s) > 1”)#不能保證

在哪裏條款不保證strlenUDF調用後過濾null。

執行適當的null檢查,我們建議你做以下:

  • 讓UDF本身null-aware和做空檢查內部UDF本身

  • 使用如果情況下表達式進行null檢查和調用UDF條件分支

火花udf注冊(“strlen_nullsafe”,λ年代:len(年代)如果年代沒有一個其他的- - - - - -1,“int”)火花sql(“選擇從test1年代不是零和strlen_nullsafe (s) > 1”)/ /好吧火花sql(“從test1如果選擇s (s not null, strlen (s), null) > 1”)/ /好吧