全部產品
Search
文件中心

MaxCompute:UDAF概述

更新時間:Jun 19, 2024

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

背景資訊

UDAF為使用者自訂彙總函式,適用於多進一出業務情境。即其輸入與輸出是多對一的關係,將多條輸入記錄彙總成一個輸出值。MaxCompute支援您通過如下兩種代碼語言編寫UDAF。
UDAF類型說明
Java UDAF使用Java語言編寫UDAF邏輯實現代碼。更多資訊,請參見Java UDAF
Python UDAF使用Python語言編寫UDAF邏輯實現代碼,支援Python 2和Python 3:
  • Python 2 UDAF:Python語言版本為2.7。更多資訊,請參見Python 2 UDAF
  • Python 3 UDAF:Python語言版本為CPython-3.7.3。更多資訊,請參見Python 3 UDAF

使用限制

  • 訪問外網

    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的開發流程如下。

    調用UDF

    開發完成UDF並將UDF註冊至MaxCompute後,在後續開發作業過程中您即可使用此UDF函數。自訂函數的使用方法如下:

    • 在歸屬MaxCompute專案中使用自訂函數:使用方法與內建函數類似,您可以參照內建函數的使用方法使用自訂函數。

    • 跨專案使用自訂函數:即在專案A中使用專案B的自訂函數,跨專案分享語句樣本:select B:udf_in_other_project(arg0, arg1) as res from table_t;。更多跨專案分享資訊,請參見基於Package跨專案訪問資源