全部產品
Search
文件中心

:Hive相容資料類型版本

更新時間:Jun 19, 2024

Hive相容資料類型版本是MaxCompute三種資料類型版本之一,該資料類型版本下僅支援Hive相容資料類型。本文為您介紹Hive相容資料類型版本的定義、支援的資料類型以及與其他資料類型版本的差異。

定義

專案空間選擇資料類型版本為Hive相容資料類型版本時,專案空間的資料類型屬性參數定義如下。
setproject odps.sql.type.system.odps2=true; --開啟MaxCompute 2.0資料類型。
setproject odps.sql.decimal.odps2=true; --開啟Decimal 2.0資料類型。
setproject odps.sql.hive.compatible=true; --開啟Hive相容模式。

適用情境

適用於從Hadoop遷移的MaxCompute專案,且該專案依賴的產品組件支援2.0資料類型版本。

基礎資料類型

Hive相容資料類型版本支援的基礎資料類型與2.0資料類型定義基本一致,只有DECIMAL資料類型在兩個版本下有些差異。
類型常量樣本描述
TINYINT1Y、-127Y8位有符號整型。

取值範圍:-128~127。

SMALLINT32767S、-100S16位有符號整型。

取值範圍:-32768~32767。

INT1000、-1564578732位有符號整型。

取值範圍:-2 31~2 31-1。

BIGINT100000000000L、-1L64位有符號整型。

取值範圍:-2 63+1~2 63 -1。

BINARYunhex('FA34E10293CB42848573A4E39937F479')位元據類型,目前長度限制為8MB。
FLOATcast(3.14159261E+7 as float)32位二進位浮點型。
DOUBLE3.14159261E+764位二進位浮點型。
DECIMAL(precision,scale)3.5BD、 99999999999.9999999BD10進位精確數字類型。
  • precision:表示最多可以表示多少位的數字。取值範圍:1 <= precision <= 38
  • scale:表示小數部分的位元。取值範圍:0 <= scale <= 18

如果不指定以上兩個參數,則預設為decimal(10,0)

VARCHAR(n)變長字元類型,n為長度。

取值範圍:1~65535。

CHAR(n)固定長度字元類型,n為長度。最大取值255。長度不足則會填充空格,但空格不參與比較。
STRING"abc"、'bcd'、"alibaba"、'inc'字串類型,長度限制為8 MB。
DATEDATE'2017-11-11'日期類型,格式為yyyy-mm-dd

取值範圍:0000-01-01~9999-12-31。

DATETIMEDATETIME'2017-11-11 00:00:00'日期時間類型。

取值範圍:0000-01-01 00:00:00.000~9999-12-31 23:59:59.999,精確到毫秒。

TIMESTAMPTIMESTAMP'2017-11-11 00:00:00.123456789'與時區不轉換的時間戳記類型。

取值範圍:0000-01-01 00:00:00.000000000~9999-12-31 23:59:59.999999999,精確到納秒。

說明 對於部分時區相關的函數,例如cast(<a timestamp> as string),要求TIMESTAMP按照與當前時區相符的方式來展現。
BOOLEANTrue、FalseBOOLEAN類型。

取值範圍:True、False。

資料類型說明如下:
  • 上述的各種資料類型均可以為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資料類型的內建函數,可以正常使用。
    • UDF包含的資料類型都會按照Hive相容資料類型進行解析重載。
    • 分區列支援STRING、VARCHAR、CHAR、TINYINT、SMALLINT、INT、BIGINT資料類型。
    • Hive模式下,部分函數不支援分區裁剪,詳情請參見與Hive、MySQL、Oracle內建函數對照表
  • STRING常量支援串連。例如,abc和xyz會解析為abcxyz。
  • 給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
  • array<int>
  • array<struct<a:int, b:string>>
  • array(1, 2, 3)
  • array(array(1, 2), array(3, 4))
MAP
  • map<string, string>
  • map<smallint, array<string>>
  • map(“k1”, “v1”, “k2”, “v2”)
  • map(1S, array(‘a’, ‘b’), 2S, array(‘x’, ‘y’))
STRUCT
  • struct<x:int, y:int>
  • struct<field1:bigint, field2:array<int>, field3:map<int, int>>
  • named_struct(‘x’, 1, ‘y’, 2)
  • named_struct(‘field1’, 100L, ‘field2’, array(1, 2), ‘field3’, map(1, 100, 2, 200))
說明 MaxCompute的複雜資料類型可以被嵌套使用,相關的內建函數說明請參見ARRAYMAPSTRUCT

與其他資料類型版本的差異

  • 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。
    • 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。