MaxCompute支持您通過Java、Python語言編寫代碼創建UDAF,擴展MaxCompute的函數能力,滿足個性化業務需求。本文為您介紹UDAF類型、使用限制、注意事項、開發流程及使用說明等信息。
背景信息
UDAF為用戶自定義聚合函數,適用于多進一出業務場景。即其輸入與輸出是多對一的關系,將多條輸入記錄聚合成一個輸出值。MaxCompute支持您通過如下兩種代碼語言編寫UDAF。
UDAF類型 | 說明 |
Java UDAF | 使用Java語言編寫UDAF邏輯實現代碼。更多信息,請參見Java UDAF。 |
Python UDAF | 使用Python語言編寫UDAF邏輯實現代碼,支持Python 2和Python 3:
|
使用限制
訪問外網
MaxCompute默認不支持通過自定義函數訪問外網。如果您需要通過自定義函數訪問外網,請根據業務情況填寫并提交網絡連接申請表單,MaxCompute技術支持團隊會及時聯系您完成網絡開通操作。表單填寫指導,請參見網絡開通流程。
訪問VPC網絡
MaxCompute默認不支持通過UDF訪問VPC網絡。如果您的UDF涉及訪問VPC網絡中的資源時,需要先創建MaxCompute與目標VPC網絡間的網絡連接,才可以直接通過UDF訪問VPC網絡中的資源,操作詳情請參見通過UDF訪問VPC網絡資源。
讀取表數據
目前版本不支持使用UDF/UDAF/UDTF讀取以下場景的表數據:
做過表結構修改(Schema Evolution)的表數據。
包含復雜數據類型的表數據。
包含JSON數據類型的表數據。
Transactional表的表數據。
注意事項
使用自定義函數時,您需要注意:
在性能上,自定義函數的性能低于內建函數,建議您優先使用內建函數實現相同邏輯的業務需求。
在SQL語句中使用自定義函數時,如果計算的數據量過大并且存在傾斜,會導致作業占用的內存超出默認分配的內存。此時,您可以在Session級別設置
set odps.sql.udf.joiner.jvm.memory=xxxx;
屬性來解決此問題。更多自定義函數常見問題,請參見MaxCompute UDF常見問題。當自定義函數的名稱與內建函數的名稱相同時,自定義函數會覆蓋同名的內建函數。例如,MaxCompute中存在一個名稱為CONCAT的自定義函數,則系統默認會調用自定義的CONCAT,不會調用內建函數CONCAT。如果您希望調用內建函數,需要在內建函數前增加
::
符號,例如select ::concat('ab', 'c');
。
開發流程
UDAF的開發流程如下。
使用Java開發
當您使用Java代碼編寫MaxCompute UDF時,開發流程如下。
步驟 | 步驟描述 | 支持的工具平臺 | 注意事項/相關文檔 | |
① | 可選 | 當您使用Maven編寫代碼時,需要先在Pom文件中添加代碼相關SDK依賴,確保后續編寫的代碼可編譯成功。例如開發自定義函數需要添加的SDK依賴為:
您可以從Maven庫中搜索 |
| 無 |
② | 必選 | 根據業務需求,編寫自定義函數代碼。 |
| 使用Java開發UDF時需滿足Java UDF的開發規范,詳情請參見UDF開發規范與通用流程(Java)。 |
③ | 必選 | 通過本地運行或單元測試方式調試自定義函數,查看運行結果是否符合預期。 | ||
④ | 必選 | 調試自定義函數代碼,確保本地運行成功后打包為JAR包。 | ||
⑤ | 必選 | 將JAR包作為資源上傳至MaxCompute項目。 |
| |
⑥ | 必選 | 基于上傳的JAR包資源創建自定義函數。 | ||
⑦ | 可選 | 在查詢數據代碼中調用自定義函數。 | 無 |
使用Python開發
當您使用Python代碼編寫MaxCompute UDF時,開發流程如下。
步驟 | 步驟描述功能介紹 | 支持的工具平臺 | 注意事項/相關文檔 | |
① | 必選 | 根據業務需求,編寫自定義函數代碼。 | 使用Python開發UDF時需滿足Python UDF的開發規范,詳情請參見UDF開發規范與通用流程(Python3)、UDF開發規范與通用流程(Python2)。 | |
② | 必選 | 通過本地運行或單元測試方式調試自定義函數,查看運行結果是否符合預期。 | ||
③ | 必選 | 將Python文件或依賴的資源(例如文件資源、表資源、第三方包)上傳至MaxCompute項目。 |
| |
④ | 必選 | 基于上傳的Python文件或依賴的資源創建自定義函數。 | ||
⑤ | 可選 | 在查詢數據代碼中調用自定義函數。 | 無 |
調用UDF
開發完成UDF并將UDF注冊至MaxCompute后,在后續開發作業過程中您即可使用此UDF函數。自定義函數的使用方法如下:
在歸屬MaxCompute項目中使用自定義函數:使用方法與內建函數類似,您可以參照內建函數的使用方法使用自定義函數。
跨項目使用自定義函數:即在項目A中使用項目B的自定義函數,跨項目分享語句示例:
select B:udf_in_other_project(arg0, arg1) as res from table_t;
。更多跨項目分享信息,請參見基于Package跨項目訪問資源。