MaxCompute自身預置了諸多函數,可以滿足大部分業務場景的數據處理需求。本文為您介紹MaxCompute提供的函數類型及函數使用相關說明。
背景信息
MaxCompute預置的函數類型如下。
函數類型 | 說明 |
支持處理DATE、DATETIME、TIMESTAMP等日期類型數據,實現加減日期、計算日期差值、提取日期字段、獲取當前時間、轉換日期格式等業務處理能力。 | |
支持處理BIGINT、DOUBLE、DECIMAL、FLOAT等數值類型數據,實現轉換進制、數學運算、四舍五入、獲取隨機數等業務處理能力。 | |
支持在指定的開窗列中,實現求和、求最大最小值、求平均值、求中間值、數值排序、數值偏移、抽樣等業務處理能力。 | |
支持將多條輸入記錄聚合成一條輸出值,實現求和、求平均值、求最大最小值、求平均值、參數聚合、字符串連接等業務處理能力。 | |
支持處理STRING類型字符串,實現截取字符串、替換字符串、查找字符串、轉換大小寫、轉換字符串格式等業務處理能力。 | |
支持處理MAP、ARRAY、STRUCT及JSON類型數據,實現去重元素、聚合元素、元素排序、合并元素等業務處理能力。其中JSON函數的使用限制請參見JSON函數的使用限制。 | |
支持處理STRING、BINARY類型的表數據,實現加密、解密等業務處理能力。 | |
除上述函數之外,提供支持其他業務場景的函數。 |
各類型函數與開源函數的對照關系,請參見與Hive、MySQL、Oracle內建函數對照表。
注意事項
在使用內建函數時,需要注意:
內建函數的入參類型、入參數量、函數格式必須滿足函數語法要求,否則MaxCompute無法成功解析函數,SQL運行會報錯。
如果內建函數的入參涉及2.0新數據類型(例如TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMP或BINARY),您需要打開2.0新數據類型開關,否則運行會報錯。開關打開方式如下:
Session級別:您需要在SQL語句前加上
set odps.sql.type.system.odps2=true;
,與SQL語句一起提交執行。該配置僅對本次運行的SQL有效。Project級別:Project Owner可根據需要對MaxCompute項目進行設置,等待10~15分鐘后才會生效。該配置對后續運行的所有SQL有效。
setproject odps.sql.type.system.odps2=true;
當MaxCompute項目打開2.0新數據類型開關時,部分隱式類型轉換會被禁用,包括STRING轉換為BIGINT、STRING轉換為DATETIME、DOUBLE轉換為BIGINT、DECIMAL轉換為DOUBLE、DECIMAL轉換為BIGINT,都有精度損失或報錯的風險。此時,您可以通過CAST函數執行強制轉換解決該問題,或關閉2.0新數據類型開關。
當自定義函數的名稱與內建函數的名稱相同時,自定義函數會覆蓋同名的內建函數。例如,MaxCompute中存在一個名稱為CONCAT的自定義函數,則系統默認會調用自定義的CONCAT,不會調用內建函數CONCAT。如果您希望調用內建函數,需要在內建函數前增加
::
符號,例如select ::concat('ab', 'c');
。如果MaxCompute項目的全局屬性設置不同,內建函數運行的結果可能會不一致,您可以通過
setproject;
命令查看項目的全局屬性信息。
JSON函數的使用限制
目前支持的開發工具包括odpscmd客戶端和Studio,暫不支持DataWorks,Dataphin等外圍生態,如果需要跟外部系統做組合使用時,請先確認后再使用。使用odpscmd客戶端和Studio時需要關注以下內容。
使用odpscmd客戶端
使用Studio
需要將客戶端升級到最新版本,否則無法使用
desc json_table
命令。需要將客戶端安裝路徑下的conf\odps_config.ini文件中的參數
use_instance_tunnel
設置為false,否則查詢會報錯。
Studio只支持查詢JSON類型的操作,不支持上傳、下載JSON類型數據。
如果表存在其他引擎讀取情況,比如Hologres等,目前不支持讀取JSON數據類型。
暫不支持對一張表新增JSON列。
暫不支持對JSON類型的比較操作,也不支持對JSON類型進行
ORDER BY
、GROUP BY
或作為JOIN
的key等。目前JSON NUMBER的整數和小數分別使用BIGINT和DOUBLE類型進行存儲。當整數部分超出BIGINT范圍時會溢出,小數轉為DOUBLE時會損失精度。
生成JSON類型數據所用的字符串里不支持UNICODE
\u0000
。Java UDF和Python UDF暫不支持JSON類型。
目前JSON類型不支持Cluster表。
字符串函數的使用限制
以下函數只支持英文字符的轉換:
TRIM/RTRIM/LTRIM:trimChars只支持英文字符。
REVERSE:在Hive模式下只支持英文字符。
SOUNDEX:僅轉換英文字符。
TOLOWER:將字符串中的英文字符轉換為小寫形式。
TOUPPER:將字符串中的英文字符轉換為大寫形式。
INITCAP:將字符串中每個單詞首字母(英文字符)轉化為大寫形式,其余為小寫。