本文為您介紹MaxCompute 2.0資料類型版本的定義、使用情境、支援的資料類型以及與其它資料類型版本的差異。
定義
專案空間選擇資料類型版本為2.0資料類型版本時,專案空間的資料類型屬性參數定義如下。
setproject odps.sql.type.system.odps2=true; --開啟MaxCompute 2.0資料類型。
setproject odps.sql.decimal.odps2=true; --開啟Decimal 2.0資料類型。
setproject odps.sql.hive.compatible=false; --關閉Hive相容模式。
適用情境
適用於在2020年04月之前無存量資料的MaxCompute專案,且該專案依賴的產品組件支援2.0資料類型版本。
基礎資料類型
類型 | 常量樣本 | 描述 |
TINYINT | 1Y、-127Y | 8位有符號整型。 取值範圍:-128~127。 |
SMALLINT | 32767S、-100S | 16位有符號整型。 取值範圍:-32768~32767。 |
INT | 1000、-15645787 | 32位有符號整型。 取值範圍:-2 31~2 31-1。 |
BIGINT | 100000000000L、-1L | 64位有符號整型。 取值範圍:-2 63+1~2 63 -1。 |
BINARY |
| 位元據類型,目前長度限制為8 MB。 說明
|
FLOAT | 3.14F、cast(3.14159261E+7 as float) | 32位二進位浮點型。 說明 由於電腦儲存以及內部計算邏輯,用FLOAT類型進行計算時會有精度損失,如果對精度要求比較高,需要將FLOAT資料類型轉換成DECIMAL類型進行計算。 |
DOUBLE | 3.14D、3.14159261E+7 | 64位二進位浮點型。 說明 由於電腦儲存以及內部計算邏輯,用DOUBLE類型進行計算時會有精度損失,如果對精度要求比較高,需要將DOUBLE資料類型轉換成DECIMAL類型進行計算。 |
DECIMAL(precision,scale) | 3.5BD、99999999999.9999999BD | 10進位精確數字類型。
如果不指定以上兩個參數,則預設為 說明
|
VARCHAR(n) | 無 | 變長字元類型,n為長度。 取值範圍:1~65535。 |
CHAR(n) | 無 | 固定長度字元類型,n為長度,最大取值為255。長度不足則會填充空格,但空格不參與比較。 |
STRING | "abc"、'bcd'、"alibaba"、'inc' | 字串類型,目前長度限制為8 MB。 |
DATE | DATE'2017-11-11' | 日期類型,格式為 取值範圍:0001-01-01~9999-12-31。 |
DATETIME | DATETIME'2017-11-11 00:00:00' | 日期時間類型。 取值範圍:0001-01-01 00:00:00.000~9999-12-31 23:59:59.999,精確到毫秒。 |
TIMESTAMP | TIMESTAMP'2017-11-11 00:00:00.123456789' | 時間戳記類型。 取值範圍:0001-01-01 00:00:00.000000000~9999-12-31 23:59:59.999999999,精確到納秒。 說明 TIMESTAMP類型本身與時區不轉換,在任何時區,TIMESTAMP類型儲存的都是從Epoch(UTC 1970-01-01 00:00:00)開始的一個位移量。您可以通過內建函數對TIMESTAMP類型資料執行與時區相關的計算,如 |
TIMESTAMP_NTZ | TIMESTAMP_NTZ '2017-11-11 00:00:00.123456789' | 無時區時間戳記類型。 取值範圍:0000-01-01 00:00:00.000000000~9999-12-31 23:59:59.999999999。關於TIMESTAMP_NTZ資料類型介紹,詳情請參見MaxCompute TIMESTAMP_NTZ資料類型。 |
BOOLEAN | True、False | BOOLEAN類型。 取值範圍:True、False。 |
INTERVAL |
| 代表時間段的資料類型,用來表示兩個日期或時間之間的時間間隔。包含INTERVAL_YEAR_MONTH和INTERVAL_DAY_TIME兩種類型。詳情請參見INTERVAL資料類型。 |
資料類型說明如下:
上述的各種資料類型均可以為NULL。
SQL中的INT關鍵字是32位整型。
--將a轉換為32位整型。 CAST(a AS INT)
整型常量的語義會預設為INT類型。例如
SELECT 1 + a;
中的整型常量1會被作為INT類型處理。如果常量過長,超過了INT的範圍而又沒有超過BIGINT的範圍,則會作為BIGINT類型處理;如果超過了BIGINT的範圍,則會被作為DOUBLE類型處理。隱式轉換
部分隱式類型轉換會被禁用。例如,STRING->BIGINT、STRING->DATETIME、DOUBLE->BIGINT、DECIMAL->DOUBLE、DECIMAL->BIGINT有精度損失或者報錯的風險。禁用類型可以通過CAST函數強制進行資料類型轉換。
VARCHAR類型常量可以通過隱式轉換為STRING常量。
表、函數以及UDF
參數涉及2.0資料類型的內建函數,在2.0資料類型版本下可以正常使用。
UDF包含的資料類型都會按照2.0資料類型進行解析重載。
分區列支援STRING、VARCHAR、CHAR、TINYINT、SMALLINT、INT、BIGINT資料類型。
STRING常量支援串連,多(2個及以上)個字串放一起,會自動連接成一個字串,例如執行
select 'abc' 'efg' 'ddt';
,返回結果為abcefgddt
。給DECIMAL欄位插入常量時,常量的寫法需要與常量定義中的格式保持一致。例如下面範例程式碼中的
3.5BD
。INSERT INTO test_tb(a) VALUES (3.5BD)
DATETIME查詢顯示的時間值不包含毫秒。Tunnel命令通過
-dfp
來指定時間格式,可以指定到毫秒顯示,例如tunnel upload -dfp 'yyyy-MM-dd HH:mm:ss.SSS'
。關於Tunnel命令的更多資訊,請參見Tunnel命令。
複雜資料類型
類型 | 定義方法 | 構造方法 |
ARRAY |
|
|
MAP |
|
|
STRUCT |
|
|
JSON |
|
|
與其他資料類型版本的差異
DML文法行為差異
集合操作中的LIMIT語句行為不同。
例如,對於
SELECT * FROM t1 UNION ALL SELECT * FROM t2 LIMIT 10;
:1.0資料類型版本下時為
SELECT * FROM t1 UNION ALL SELECT * FROM ( SELECT * FROM t2 LIMIT 10) t2;
。2.0資料類型版本下時為
SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2 ) t LIMIT 10;
。
ORDER BY、DISTRIBUTE BY、SORT BY和CLUSTER BY操作也具有上述行為特點。
IN運算式的類型解析不同。
例如
a in (1, 2, 3)
:1.0資料類型版本時,要求IN後面的括弧裡的所有值的類型必須一致。
2.0資料類型版本時,IN後面的括弧裡的所有值支援隱式類型轉換一致即可。
- INSERT語句轉換規則不同。
- Hive相容資料類型:來源資料類型如果可以顯式轉換為表中的資料類型,系統會自動插入轉換函式並允許運行。
- 1.0和2.0資料類型版本:來源資料類型需要隱式轉換為表中的資料類型,否則報錯。
--在Hive模式下成功,在其他模式下報錯。 create table t (a bigint); insert into table select 1.5;
- 函數行為差異
+
、-
、*
、/
、POW函數- Hive相容資料類型版本:在資料溢出時繞回(即資料超出範圍後返回初始值)。
- 1.0和2.0資料類型版本:在資料溢出時報告異常,其它模式下返回NULL。
>
、>=
、=
、<
、<=
- Hive相容資料類型版本:在比較DOUBLE類型資料時,直接比較Double值。
- 1.0和2.0資料類型版本:在比較DOUBLE類型資料時,如果小數點後15位以前資料相同,認為資料相同。15位以後的資料不作比較。
- 位操作運算子
&
、|
、^
- Hive相容資料類型版本:返回參數類型。
- 1.0和2.0資料類型版本:傳回型別為BIGINT。
- LENGTH、LENGTHB、FIND_IN_SET、INSTR、SIZE、HASH、SIGN函數
- Hive相容資料類型版本:傳回型別為INT。
- 1.0和2.0資料類型版本:傳回型別為BIGINT。
- FLOOR、CEIL
- Hive相容資料類型版本:如果參數為DECIMAL類型,在Hive相容資料類型版本下傳回型別仍為DECIMAL。
- 1.0和2.0資料類型版本:如果參數為DECIMAL類型,在1.0和2.0資料類型版本下傳回型別為BIGINT。
- FROM_UNIXTIME
- Hive相容資料類型版本:傳回值為STRING類型。
- 1.0和2.0資料類型版本:傳回值為DATETIME類型。
- CONCAT_WS
- Hive相容資料類型版本:如果一個被串連的輸入字串為NULL,此字串被忽略。
- 1.0和2.0資料類型版本:如果一個被串連的輸入字串為NULL,則返回NULL。
- FIND_IN_SET
- Hive相容資料類型版本:Null 字元串認為匹配字串尾部。
--Hive相容模式下 find_in_set("","") 結果是1。 find_in_set("", "a,") 結果是2。
- 1.0和2.0資料類型版本:Null 字元串認為不匹配返回0。
- Hive相容資料類型版本:Null 字元串認為匹配字串尾部。
- REGEXP_(EXTRACT/REPLACE)
- Hive相容資料類型版本:REGEXP的模式定義符合Java regex規範。
- 1.0和2.0資料類型版本:REGEXP的模式定義符合MaxCompute規範。
- SUBSTR
string substr(string <str>, bigint <start_position>[, bigint <length>])
start_position:必填,為BIGINT類型,預設起始位置為1。
Hive相容資料類型版本:當start_position為0時,與起始位置為1時相同。
1.0和2.0資料類型版本:當start_position為0時,返回NULL。