用戶定義函數(udf)是什麼?
一個用戶定義的函數(UDF)是由一個用戶定義的函數,允許自定義邏輯在用戶環境中被重用。磚支持許多不同類型的udf允許分配可擴展的邏輯。本文介紹的一些udf的一般優點和局限性。
udf的更多信息,請參見下麵的文章:
自定義邏輯不是一個UDF是什麼時候?
並不是所有的自定義函數是嚴格意義上的udf。您可以安全地定義一係列的火花內置方法使用SQL或火花DataFrames並得到充分優化行為。例如,下麵的SQL和Python函數結合火花內置方法定義一個單位轉換為一個可重用的功能:
創建函數convert_f_to_c(單位字符串,臨時雙)返回雙返回情況下當單位=“F”然後(臨時- - - - - -32)*(5/9)其他的臨時結束;選擇convert_f_to_c(單位,臨時)作為c_temp從tv_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執行的邏輯額外成本數據序列化。
有些udf是比其他的更有效。在性能方麵:
內建函數將最快,因為磚優化器。
在JVM中執行的代碼(Scala、Java、蜂巢udf)將快於Python udf。
熊貓udf使用箭頭來減少序列化成本與Python udf。
Python udf通常應該避免,但Python可以用作粘合代碼沒有任何性能退化。
類型 |
優化 |
執行環境 |
---|---|---|
蜂巢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=pd。DataFrame(np。隨機。正常的(55,25,10000000),列=(“臨時”])Fdf(“單元”]=“F”提供=pd。DataFrame(np。隨機。正常的(10,10,10000000),列=(“臨時”])提供(“單元”]=“C”df=火花。createDataFrame(pd。concat([Fdf,提供])。樣本(裂縫分析=1))df。緩存()。數()df。createOrReplaceTempView(“tv_temp”)