全部產品
Search
文件中心

MaxCompute:UDTF概述

更新時間:Jun 19, 2024

MaxCompute支援您通過Java、Python語言編寫代碼建立UDTF,擴充MaxCompute的函數能力,滿足個人化業務需求。本文為您介紹UDTF類型、使用限制、注意事項、開發流程及使用說明等資訊。

背景資訊

UDTF為使用者自訂表格值函數,適用於一進多出業務情境。即其輸入與輸出是一對多的關係,讀入一行資料,輸出多個值可視為一張表。MaxCompute支援您通過如下兩種代碼語言編寫UDTF。

UDTF類型

說明

Java UDTF

使用Java語言編寫UDTF邏輯實現代碼。更多資訊,請參見Java UDTF

Python UDTF

使用Python語言編寫UDTF邏輯實現代碼,支援Python 2和Python 3:

  • Python 2 UDTF:Python語言版本為2.7。更多資訊,請參見Python 2 UDTF

  • Python 3 UDTF:Python語言版本為CPython-3.7.3。更多資訊,請參見Python 3 UDTF

MaxCompute支援的內建函數中包含部分UDTF函數,例如EXPLODE,更多內建UDTF函數資訊,請參見其他函數複雜類型函數

使用限制

  • 不支援通過自訂函數訪問外網。如果您需要通過自訂函數訪問外網,請根據業務情況填寫並提交表單,MaxCompute支援人員團隊會及時聯絡您完成網路開通操作。表單填寫指導,請參見網路開通流程

  • select語句中使用UDTF時,不允許存在其他列或運算式。錯誤樣本如下。

    --查詢語句中同時攜帶了UDTF和其他列。
    select value, user_udtf(key) as mycol ...
  • UDTF不能嵌套使用。錯誤樣本如下。

    --user_udtf1嵌套了user_udtf2,不允許嵌套。
    select user_udtf1(user_udtf2(key)) as mycol...;
  • 不支援在同一個select子句中與group bydistribute bysort by聯用。錯誤樣本如下。

    --UDTF不能與group by聯用。
    select user_udtf(key) as mycol ... group by mycol;

注意事項

使用自訂函數時,您需要注意:

  • 在效能上,自訂函數的效能低於內建函數,建議您優先使用內建函數實現相同邏輯的業務需求。

  • 在SQL語句中使用自訂函數時,如果計算的資料量過大並且存在傾斜,會導致作業佔用的記憶體超出預設分配的記憶體。此時,您可以在Session層級設定set odps.sql.udf.joiner.jvm.memory=xxxx;屬性來解決此問題。更多自訂函數常見問題,請參見MaxCompute UDF常見問題

  • 當自訂函數的名稱與內建函數的名稱相同時,自訂函數會覆蓋同名的內建函數。例如,MaxCompute中存在一個名稱為CONCAT的自訂函數,則系統預設會調用自訂的CONCAT,不會調用內建函數CONCAT。如果您希望調用內建函數,需要在內建函數前增加::符號,例如select ::concat('ab', 'c');

開發流程

自訂純量涵式(UDF\UDTF\UDAF)的開發流程如下。

說明

UDF(嵌入式)SQL自訂函數UDF(地理空間)的開發流程與此不同,請以對應文檔描述為準。

使用Java開發

當您使用Java代碼編寫MaxCompute UDF時,開發流程如下。

Java開發流程

步驟

步驟描述

支援的工具平台

注意事項/相關文檔

可選

當您使用Maven編寫代碼時,需要先在Pom檔案中添加代碼相關SDK依賴,確保後續編寫的代碼可編譯成功。例如開發自訂函數需要添加的SDK依賴為:

<dependency>
    <groupId>com.aliyun.odps</groupId>
    <artifactId>odps-sdk-udf</artifactId>
   <version>0.29.10-public</version>
</dependency>

您可以從Maven庫中搜尋odps-sdk-udf,擷取SDK依賴版本資訊。

  • IntelliJ IDEA(Maven)

必選

根據業務需求,編寫自訂函數代碼。

使用Java開發UDF時需滿足Java UDF的開發規範,詳情請參見UDF開發規範與通用流程(Java)

必選

通過本地運行或單元測試方式調試自訂函數,查看運行結果是否符合預期。

必選

調試自訂函數代碼,確保本地運行成功後打包為JAR包。

必選

將JAR包作為資源上傳至MaxCompute專案。

必選

基於上傳的JAR包資源建立自訂函數。

可選

在查詢資料代碼中調用自訂函數。

使用Python開發

當您使用Python代碼編寫MaxCompute UDF時,開發流程如下。Python開發流程

步驟

步驟描述功能介紹

支援的工具平台

注意事項/相關文檔

必選

根據業務需求,編寫自訂函數代碼。

MaxCompute Studio

使用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跨專案訪問資源