用戶自定義標量函數——Python
本文包含Python用戶定義函數(UDF)的例子。它顯示了如何注冊udf,如何調用udf,提供關於評價子表達式的順序在火花SQL警告。
請注意
在磚運行時的13.1和下麵,Python UDF和UDAF(用戶定義的聚合函數)不支持集群統一目錄,使用共享訪問模式。這些udf在磚運行時支持13.2及以上所有訪問模式。
在磚運行時13.2及以上的,你可以注冊標量Python udf統一目錄使用SQL語法。看到用戶定義的函數(udf)的聯合目錄。
注冊一個函數作為一個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進口udf從pyspark.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”)#不能保證
這在哪裏
條款不保證strlen
UDF調用後過濾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”)/ /好吧