UDF(User-Defined Function)即自訂函數,當MaxCompute提供的內建函數無法支撐您的業務實現時, 您可以根據本文中的開發流程及使用樣本,自行編寫代碼邏輯建立自訂函數,以滿足多樣化業務需求。
背景資訊
廣義的UDF定義是自訂純量涵式(UDF)、自訂表格值函數(UDTF)及自訂彙總函式(UDAF)三種類型的自訂函數的集合。狹義的UDF僅代表使用者自訂純量涵式。MaxCompute UDF支援的自訂函數類型如下。
自訂函數類型 | 名稱 | 應用情境 |
User Defined Scalar Function。使用者自訂純量涵式。 | 適用於一進一出業務情境。即其輸入與輸出是一對一的關係,讀入一行資料,輸出一個值。 | |
User Defined Table Valued Function。使用者自訂表格值函數,又稱表格UDF。 | 適用於一進多出業務情境。即其輸入與輸出是一對多的關係,讀入一行資料,輸出多個值可視為一張表。 | |
User Defined Aggregation Function。使用者自訂彙總函式。 | 適用於多進一出業務情境。即其輸入與輸出是多對一的關係,將多條輸入記錄彙總成一個輸出值。 |
除上述自訂函數外,MaxCompute還提供如下針對特殊情境的能力支撐。
自訂函數類型 | 應用情境 |
當您需要簡化MaxCompute UDF操作步驟,並希望能直接查看代碼實現邏輯時,您可以直接將Java或Python代碼嵌入SQL指令碼。 | |
當您的代碼中存在很多相似部分時,可以通過SQL自訂函數實現,提高代碼複用率的同時還可以簡化操作流程。 | |
支援在MaxCompute中使用Hive地理空間函數分析空間資料。 |
使用限制
訪問外網
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');
。
開發UDF:支援的工具與通用流程
自訂純量涵式(UDF\UDTF\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檔案或依賴的資源建立自訂函數。 | ||
⑤ | 可選 | 在查詢資料代碼中調用自訂函數。 | 無 |
開發參考:MaxCompute SDK
MaxCompute為您提供了SDK,資訊如下。您在開發UDF過程中如果需要使用MaxCompute SDK包,可在MaxCompute SDK中查看各SDK中包含的Package,以及Package中的Class詳細資料。
SDK名稱 | 描述 |
odps-sdk-core | 提供操作MaxCompute基本資源的類。 |
odps-sdk-commons | Java Util封裝。 |
odps-sdk-udf | UDF功能的主體介面。 |
odps-sdk-mapred | MapReduce API。 |
odps-sdk-graph | Graph API。 |
調用UDF
開發完成UDF並將UDF註冊至MaxCompute後,在後續開發作業過程中您即可使用此UDF函數。自訂函數的使用方法如下:
在歸屬MaxCompute專案中使用自訂函數:使用方法與內建函數類似,您可以參照內建函數的使用方法使用自訂函數。
跨專案使用自訂函數:即在專案A中使用專案B的自訂函數,跨專案分享語句樣本:
select B:udf_in_other_project(arg0, arg1) as res from table_t;
。更多跨專案分享資訊,請參見基於Package跨專案訪問資源。