用戶定義函數(udf)是什麼?

一個用戶定義的函數(UDF)是由一個用戶定義的函數,允許自定義邏輯在用戶環境中被重用。磚支持許多不同類型的udf允許分配可擴展的邏輯。本文介紹的一些udf的一般優點和局限性。

請注意

並不是所有形式的udf在磚上的所有執行環境。

udf的更多信息,請參見下麵的文章:

定義自定義邏輯沒有序列化處罰

磚繼承的UDF從Apache引發行為,包括效率限製在許多類型的UDF。看到udf是最有效的?

您可以安全地模塊化代碼而不用擔心與udf相關的潛在效率的權衡。要做到這一點,你必須定義邏輯作為一係列的火花內置方法使用SQL或引發DataFrames。例如,下麵的SQL和Python函數結合火花內置方法定義一個單位轉換為一個可重用的功能:

創建函數convert_f_to_c(單位字符串,臨時)返回返回情況下單位=“F”然後(臨時- - - - - -32)*(5/9)其他的臨時結束;選擇convert_f_to_c(單位,臨時)作為c_temptv_temp;
defconvertFtoC(unitCol,tempCol):pyspark.sql.functions進口返回(unitCol= =“F”,(tempCol- - - - - -32)*(5/9))否則(tempCol)pyspark.sql.functions進口上校df_query=df選擇(convertFtoC(上校(“單元”),上校(“臨時”)))toDF(“c_temp”)顯示(df_query)

運行上麵的udf,您可以創建示例數據

udf是最有效的?

udf可能在代碼執行中引入大量的處理瓶頸。磚使用許多不同的優化器自動編寫的代碼,包括Apache火花,SQL和三角洲湖語法。由udf引入自定義邏輯時,這些優化器不能夠有效地計劃任務在這個自定義的邏輯。此外,在JVM執行的邏輯額外成本數據序列化。

請注意

磚優化使用光子如果使用Photon-enabled計算許多功能。隻有函數鏈在一起引發SQL DataFrame命令可以優化的光子。

有些udf是比其他的更有效。在性能方麵:

  • 內建函數將最快,因為磚優化器。

  • 在JVM中執行的代碼(Scala、Java、蜂巢udf)將快於Python udf。

  • 熊貓udf使用箭頭來減少序列化成本與Python udf。

  • Python udf適合過程邏輯,但是應該避免生產ETL工作負載在大型數據集。

請注意

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

類型

優化

執行環境

蜂巢UDF

沒有

JVM

Python UDF

沒有

Python

熊貓UDF

沒有

Python(箭頭)

Scala UDF

沒有

JVM

火花SQL

是的

JVM(光子)

火花DataFrame

是的

JVM(光子)

你什麼時候應該使用UDF ?

udf的一個主要好處是,他們允許用戶用熟悉的語言表達邏輯,減少了人力成本與重構代碼。對於臨時查詢,手工數據清理,探索性數據分析,和大多數中小數據集上的操作,延遲與udf相關開銷成本不可能大於成本與重構代碼。

對ETL作業流操作,操作非常大的數據集,或其他工作負載執行定期或連續,重構邏輯使用本機Apache火花方法快速支付股息。

示例數據例如udf

本文中的代碼示例使用udf轉換溫度攝氏和華氏之間。如果您希望執行這些功能,您可以創建一個示例數據集與Python代碼如下:

進口numpy作為np進口熊貓作為pdFdf=pdDataFrame(np隨機正常的(55,25,10000000),=(“臨時”])Fdf(“單元”]=“F”提供=pdDataFrame(np隨機正常的(10,10,10000000),=(“臨時”])提供(“單元”]=“C”df=火花createDataFrame(pdconcat([Fdf,提供])樣本(裂縫分析=1))df緩存()()dfcreateOrReplaceTempView(“tv_temp”)