全部產品
Search
文件中心

MaxCompute:普通模式和Hive相容模式下SQL的差異

更新時間:Nov 26, 2025

本文為您介紹MaxCompute中運算子、類型轉換和內建函數分別在普通模式和Hive相容模式下使用的區別。

運算子

  • BITAND(&)

    當輸入參數是BIGINT類型的時候,如果BITAND的計算結果是LONG_MIN(-263),在普通模式下會返回NULL,而Hive模式仍然是LONG_MIN。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select cast((a & b) as string) from
      values(-9223372036854775807L, -9223372036854775792L) t(a, b);
      --返回NULL
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select cast((a & b) as string) from
      values(-9223372036854775807L, -9223372036854775792L) t(a, b);
      --返回-9223372036854775808
    • Hive

      select cast((-9223372036854775807L & -9223372036854775792L) as string);
      --返回-9223372036854775808
  • BITOR(|)

    當輸入參數是BIGINT類型的時候,如果BITOR的計算結果是LONG_MIN(-263),在普通模式下會返回NULL,而Hive模式仍然是LONG_MIN。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select cast((a | b) as string) from
      values(java.lang.Long.MIN_VALUE, 0L) t(a, b);
      --返回NULL
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select cast((a | b) as string) from
      values(java.lang.Long.MIN_VALUE, 0L) t(a, b);
      --返回-9223372036854775808
    • Hive

      select cast(-9223372036854775808 as bigint) | 0;
      -- 返回-9223372036854775808
  • BITXOR(^)

    當輸入參數是BIGINT類型的時候,如果BITXOR的計算結果是LONG_MIN(-263),在普通模式下會返回NULL,而Hive模式仍然是LONG_MIN。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select cast((a ^ b) as string) from
      values(java.lang.Long.MIN_VALUE, 0L) t(a, b);
      --返回NULL
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select cast((a ^ b) as string) from
      values(java.lang.Long.MIN_VALUE, 0L) t(a, b);
      --返回-9223372036854775808
    • Hive

      select cast(-9223372036854775808 as bigint) ^ 0;
      --返回-9223372036854775808
  • EQ(=)

    當輸入參數是DOUBLE類型的時候,普通模式下對相等的檢查更加寬鬆,如果兩個輸入參數足夠接近,就認為它們相等;而Hive相容模式對相等的檢查更加嚴格。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select a = 1.0 from values (1.000000000000001) t(a);
      -- 結果是true,因為這兩個數足夠接近
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select a = 1.0 from values (1.000000000000001) t(a);
      -- 結果是false
    • Hive

      select 1.0 = 1.000000000000001 ;
      -- 結果是false
  • NEQ(!=)

    當輸入參數是DOUBLE類型的時候,普通模式下對相等的檢查更加寬鬆,如果兩個輸入參數足夠接近,就認為它們相等;而Hive相容模式對相等的檢查更加嚴格。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select a != 1.0 from values (1.000000000000001) t(a);
      -- 結果是false,因為這兩個數足夠接近
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select a != 1.0 from values (1.000000000000001) t(a);
      -- 結果是true
    • Hive

      select 1.000000000000001 != 1.0 ;
      -- 結果是true
  • GE(>=)

    當輸入參數是DOUBLE類型的時候,普通模式下對相等的檢查更加寬鬆,如果兩個輸入參數足夠接近,就認為它們相等這會導致即使第1個輸入參數小於第2個參數,但是只要他們足夠接近,GE的返回結果也可能是true

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select 1.0 >= a from values (1.000000000000001) t(a);
      -- 結果是true,因為這兩個數足夠接近,認為它們相等
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select 1.0 >= a from values (1.000000000000001) t(a);
      -- 結果是false
    • Hive

      select 1.0 >= 1.000000000000001;
      -- 結果是false
  • GT(>)

    當輸入參數是DOUBLE類型的時候,普通模式下對相等的檢查更加寬鬆,如果兩個輸入參數足夠接近,就認為它們相等這會導致即使第1個輸入參數大於第2個參數,但是只要他們足夠接近,GT的返回結果也可能是false

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select a > 1.0 from values (1.000000000000001) t(a);
      -- 結果是false,因為這兩個數足夠接近,認為它們相等
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select a > 1.0 from values (1.000000000000001) t(a);
      -- 結果是true
    • Hive

      select 1.000000000000001>1.0;
      -- 結果是true
  • LE(<=)

    當輸入參數是DOUBLE類型的時候,普通模式下對相等的檢查更加寬鬆,如果兩個輸入參數足夠接近,就認為它們相等這會導致即使第1個輸入參數大於第2個參數,但是只要他們足夠接近,LE的返回結果也可能是true

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select a <= 1.0 from values (1.000000000000001) t(a);
      -- 結果是true,因為這兩個數足夠接近,認為它們相等
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select a <= 1.0 from values (1.000000000000001) t(a);
      -- 結果是false
    • Hive

      select 1.000000000000001 <= 1.0 ;
      -- 結果是false
  • LT(<)

    當輸入參數是DOUBLE類型的時候,普通模式下對相等的檢查更加寬鬆,如果兩個輸入參數足夠接近,就認為它們相等這會導致即使第1個輸入參數小於第2個參數,但是只要他們足夠接近,LE的返回結果也可能是false

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select 1.0 < a from values (1.000000000000001) t(a);
      -- 結果是false,因為這兩個數足夠接近,認為它們相等
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select 1.0 < a from values (1.000000000000001) t(a);
      -- 結果是true
    • Hive

      select 1.0 < 1.000000000000001;
      -- 結果是true
  • PLUS(+)

    計算結果超範圍時的處理不同,在普通模式時可能會報錯,在Hive相容模式計算結果溢出不會報錯,同時為兩種模式開啟strict 模式(odps.function.strictmode=true)。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select (100L + a) from values (9223372036854775807L) t(a);
      -- 報錯,計算結果溢出
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select (100L + a) from values (9223372036854775807L) t(a);
      -- 計算結果溢出,但是不會報錯
    • Hive

      select (100L + 9223372036854775807L) ;
      -- 返回-9223372036854775709,計算結果溢出,但是不會報錯
  • MINUS(-)

    計算結果超範圍時的處理不同,在普通模式時可能會報錯,在Hive相容模式計算結果溢出不會報錯,同時為兩種模式開啟strict 模式(odps.function.strictmode=true)。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select (-100L - a) from values (9223372036854775807L) t(a);
      -- 報錯,計算結果溢出
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select (-100L - a) from values (9223372036854775807L) t(a);
      -- 計算結果溢出,但是不會報錯
    • Hive

      select (-100L - 9223372036854775807L) ;
      -- 返回 9223372036854775709
  • MPL(*)

    計算結果超範圍時的處理不同,在普通模式時可能會報錯,在Hive相容模式計算結果溢出不會報錯,同時為兩種模式開啟strict 模式(odps.function.strictmode=true)。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select (a * 9223372036854775807L) from values (9223372036854775807L) t(a);
      -- 報錯,計算結果溢出
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select (a * 9223372036854775807L) from values (9223372036854775807L) t(a);
      -- 計算結果溢出,但是不會報錯
    • Hive

      select (9223372036854775807L * 9223372036854775807L) ;
      -- 返回1;計算結果溢出,但是不會報錯
  • DIV(/)

    計算結果超範圍時的處理不同,在普通模式時可能會報錯,在Hive相容模式計算結果溢出不會報錯,同時為兩種模式開啟strict 模式(odps.function.strictmode=true)。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      
      select 1 / a from values (0L) t(a);
      -- strict模式下報錯
      
      select 1.0 / a from values (0.0) t(a);
      -- strict模式下報錯
      
      select 1BD / a from values (0BD) t(a);
      -- strict模式下報錯
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      
      select 1 / a from values (0L) t(a);
      -- 返回NULL
      
      select 1.0 / a from values (0.0) t(a);
      -- 返回NULL
      
      select 1BD / a from values (0BD) t(a);
      -- 返回NULL
    • Hive

      select 1 / 0L;
      -- 返回NULL
      
      select 1.0 / 0.0;
      -- 返回NULL
      
      select 1BD / 0BD;
      -- 返回NULL

類型轉換

  • TOBIGINT

    當輸入參數不合法時,普通模式下可能會報錯,Hive相容模式返回NULL,同時為兩種模式開啟即strict 模式(odps.function.strictmode=true)。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select cast(a as bigint) from values ('hello') t(a);
      -- 報錯,輸入參數不合法
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select cast(a as bigint) from values ('hello') t(a);
      -- 返回NULL
    • Hive

      select cast('hello' as bigint) ;
      -- 返回NULL
  • TODECIMAL

    當輸入參數不合法時,普通模式下可能會報錯,Hive相容模式返回NULL,同時為兩種模式開啟即strict 模式(odps.function.strictmode=true)。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select cast(a as decimal) from values ('hello') t(a);
      -- 報錯,輸入參數不合法
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strict.mode=true;
      select cast(a as decimal) from values ('hello') t(a);
      -- 返回NULL
    • Hive

      select cast('hello' as decimal) ;
      -- 返回NULL
  • TODOUBLE

    當輸入參數不合法時,普通模式下可能會報錯,Hive相容模式返回NULL,同時為兩種模式開啟即strict 模式(odps.function.strictmode=true)。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select cast(a as double) from values ('hello') t(a);
      -- 報錯,輸入參數不合法
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select cast(a as double) from values ('hello') t(a);
      -- 返回NULL
    • Hive

      select cast('hello' as double) ;
      -- 返回NULL
  • TOSMALLINT

    當輸入參數不合法或超出範圍時,普通模式下可能會報錯,Hive相容模式返回NULL,同時為兩種模式開啟即strict 模式(odps.function.strictmode=true)。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      set odps.sql.type.system.odps2=true;
      
      select cast(a as smallint) from values ('hello') t(a);
      -- 報錯,輸入參數不合法
      
      select cast(a as smallint) from values (9223372036854775807L) t(a);
      -- 報錯,資料溢出
                                  
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      set odps.sql.type.system.odps2=true;
      
      select cast(a as smallint) from values ('hello') t(a);
      -- 返回NULL
      
      select cast(a as smallint) from values (9223372036854775807L) t(a);
      -- 資料溢出但是不報錯
                                  
    • Hive

      select cast('hello' as smallint);
      -- 返回NULL
      
      select cast(9223372036854775807L as smallint);
      -- 返回-1,資料溢出但是不報錯
                                  
  • TOTINYINT

    當輸入參數不合法或超出範圍時,普通模式下可能會報錯,Hive相容模式返回NULL,同時為兩種模式開啟即strict 模式(odps.function.strictmode=true)。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      set odps.sql.type.system.odps2=true;
      
      select cast(a as tinyint) from values ('hello') t(a);
      -- 報錯,輸入參數不合法
      
      select cast(a as tinyint) from values (9223372036854775807L) t(a);
      -- 報錯,資料溢出
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      set odps.sql.type.system.odps2=true;
      
      select cast(a as tinyint) from values ('hello') t(a);
      -- 返回NULL
      
      select cast(a as tinyint) from values (9223372036854775807L) t(a);
      -- 資料溢出但是不報錯
    • Hive

      select cast('hello' as tinyint) ;
      -- 返回NULL
      
      select cast(9223372036854775807L as tinyint) ;
      -- 返回-1,資料溢出但是不報錯

內建函數

  • ACOS

    取值超出範圍[-1,1]時,普通模式和Hive模式的表現不同。普通模式返回NULL,並且可能會報錯;而Hive模式返回NAN。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select acos(a) from values(1.5) t(a);
      --返回NULL,並且有可能會報錯
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select acos(a) from values(1.5) t(a);
      --返回NAN
    • Hive

      select acos(1.5);
      --返回NAN
  • ASCII

    普通模式ASCII函數傳回值類型為BIGINT,Hive相容模式ASCII函數傳回值類型為INT。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      explain select ascii('abcde');
      --顯示傳回值類型是bigint
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select ascii('abcde');
      --顯示傳回值類型是int
    • Hive

      explain select ascii('abcde');
      --顯示傳回值類型是int
  • ASIN

    取值超出範圍[-1,1]時,普通模式和Hive模式的表現不同。普通模式返回NULL,並且可能會報錯;而Hive模式返回NAN。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select asin(a) from values(1.5) t(a);
      --返回NULL,並且有可能會報錯
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select asin(a) from values(1.5) t(a);
      --返回NAN
    • Hive

      select asin(a) from values(1.5) t(a);
      --返回NAN
  • CEIL

    普通模式CEIL函數輸入參數類型是DECIMAL的時候,傳回值類型為BIGINT;Hive相容模式CEIL函數輸入參數類型是DECIMAL的時候,傳回值類型為DECIMAL。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      explain select ceil(1.2BD);
      --顯示傳回值類型是bigint
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select ceil(1.2BD);
      --顯示傳回值類型是decimal
    • Hive

      explain select ceil(1.2BD);
      --顯示傳回值類型是decimal(2,0)
  • CHR

    輸入參數取值超出範圍,普通模式與Hive模式的返回結果不同。普通模式會報錯,而Hive相容模式返回Null 字元串。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select chr(-100L);
      --報錯,輸入參數不合法
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select chr(-100L);
      --返回Null 字元串
    • Hive

      select chr(-100L);
      --返回Null 字元串
  • CONCAT_WS

    • 輸入參數中有NULL,普通模式與Hive模式的返回結果不同。普通模式返回NULL,而Hive相容模式會忽略輸入參數中的NULL。

    • 輸入參數中有空數組,如下所示。普通模式下會返回NULL,而Hive相容模式下會返回Null 字元串。

      string concat_ws(string <separator>, array<string>  arr)

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select concat_ws(',', 'a', null, 'b');
      -- 返回NULL
      
      select concat_ws(',', array());
      -- 返回NULL
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select concat_ws(',', 'a', null, 'b');
      -- 返回如下值:
      +-----+
      | _c0 |
      +-----+
      | a,b |
      +-----+
      
      select concat_ws(',', array());
      --返回Null 字元串
    • Hive

      select concat_ws(',', 'a', null, 'b');
      -- 返回如下值:
      +-----+
      | _c0 |
      +-----+
      | a,b |
      +-----+
      
      select concat_ws(',', array());
      --返回Null 字元串
  • COT

    當輸入參數為0(或者是其他導致計算結果為無窮大的數)時,普通模式下會返回NULL,並且可能會報錯;而Hive相容模式返回INF。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select cot(a) from values(0.0) t(a);
      --返回NULL,並且有可能會報錯
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select cot(a) from values(0.0) t(a);
      --返回INF
    • Hive不支援此函數。

  • EXP

    當使用EXPFunction Compute的結果超出輸出類型的範圍範圍時,同時為兩種模式開啟strict 模式(odps.function.strictmode=true),在普通模式下可能會報錯,而Hive相容模式返回INF。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select exp(a) from values (1000L) t(a);
      -- 報錯 Data overflow
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select exp(a) from values (1000L) t(a);
      -- 返回INF
    • Hive

      select exp(1000L) ;
      -- 返回INF
  • FIND_IN_SET

    普通模式FIND_IN_SET函數傳回值類型為BIGINT,Hive相容模式FIND_IN_SET函數傳回值類型為INT。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      explain select find_in_set('ab', 'abc,hello,ab,c');
      --顯示傳回值類型是bigint
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select find_in_set('ab', 'abc,hello,ab,c');
      --顯示傳回值類型是int
    • Hive

      explain select find_in_set('ab', 'abc,hello,ab,c');
      --顯示傳回值類型是int
  • FLOOR

    普通模式FLOOR函數輸入參數類型是DECIMAL的時候,傳回值類型為BIGINT;Hive相容模式FLOOR函數輸入參數類型是DECIMAL的時候,傳回值類型為DECIMAL。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      explain select floor(1.2BD);
      --顯示傳回值類型是bigint
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select floor(1.2BD);
      --顯示傳回值類型是decimal
    • Hive

      explain select floor(1.2BD);
      --顯示傳回值類型是decimal(2,0)
  • FROM_UNIXTIME

    • 普通模式支援如下形式的function signature,不支援指定時間的格式。

      DATETIME FROM_UNIXTIME(BIGINT time)
    • Hive相容模式支援如下兩種形式的function signature,這兩種function sigature都返回STRING類型。第1個signature允許指定輸出的時間格式,輸出的時間格式受SimpleDateFormat的控制,詳情請參見SimpleDateFormat

      STRING FROM_UNIXTIME(BIGINT time, STRING format)
      
      STRING FROM_UNIXTIME(BIGINT time)

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      
      select from_unixtime(12345678, 'yyyy-MM-dd HH:mm:ss');
      --報錯,from_unixtime只允許1個輸入參數,不允許2個輸入參數
      
      select weekday(from_unixtime(0));
      -- 執行成功,from_unixtime返回datetime類型,weekday接受datetime類型的輸入參數
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      
      select from_unixtime(12345678, 'yyyy-MM-dd HH:mm:ss');
      --返回結果如下:
      +-----+
      | _c0 |
      +-----+
      | 1970-05-24 05:21:18 |
      +-----+
      
      select weekday(from_unixtime(0));
      -- 執行失敗,因為from_unixtime返回string類型,而weekday不接受string類型輸入參數。
    • Hive

      select from_unixtime(12345678, 'yyyy-MM-dd HH:mm:ss');
      --返回結果如下:
      +-----+
      | _c0 |
      +-----+
      | 1970-05-24 05:21:18 |
      +-----+
      
      select weekday(from_unixtime(0));
      -- hive不支援weekday函數
  • FROM_UTC_TIMESTAMP

    當輸入參數超範圍時,且同時為兩種模式開啟strict 模式(odps.function.strictmode=true),普通模式返回可能會報錯,Hive相容模式返回NULL。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select from_utc_timestamp(1501557840000000, 'UTC');
      -- 報錯,輸入參數超出範圍
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select from_utc_timestamp(1501557840000000, 'UTC');
      -- 返回NULL
    • Hive

      select from_utc_timestamp(1501557840000000, 'UTC');
      -- 報錯,FAILED: IllegalArgumentException Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
  • HASH

    普通模式下HASH函數返回BIGINT類型,Hive相容模式HASH函數下返回INT類型。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;     
      explain select hash('0', '2', '4');     
      --傳回值類型是bigint
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select hash(0, 2, 4);
      --傳回值類型是int
    • Hive

      explain select hash(0, 2, 4);
      --傳回值類型是int
  • IS_ENCODING

    判斷輸入的字串是否可以從指定的一個字元集from_encoding轉為另一個字元集to_encoding。也可以用於判斷輸入是否為亂碼,通常您可以將from_encoding設為UTF-8,to_encoding設為GBK。

    • 普通模式下,輸入字串必須要能夠用from_encoding解碼成功,並能按照to_encoding編碼,結果才能返回false

    • Hive相容模式下,輸入字串必須是UTF-8編碼,並且需要能同時被from_encodingto_encoding編碼,結果才返回false

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select is_encoding('中文', 'gbk', 'utf-8');
      -- 返回false,'中文'是utf-8編碼,不能用gbk解碼,所以返回false
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select is_encoding('中文', 'gbk', 'utf-8');
      -- 返回true,'中文'既可以轉換成gbk編碼,又可以轉換成utf-8編碼
    • Hive不支援此文法。

  • INSTR

    輸入參數為兩個字串時,普通模式下傳回值類型為BIGINT,Hive相容模式下傳回值類型為INT。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      explain select instr('Tech on the net', 'e');
      --返回bigint類型
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select instr('Tech on the net', 'e');
      --返回int類型
    • Hive

      explain select instr('Tech on the net', 'e');
      --返回的是int類型
  • LENGTH

    普通模式下使用LENGTH函數傳回值類型為BIGINT,Hive相容模式下使用LENGTH函數傳回值類型為INT。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      explain select length('hello');
      --返回bigint類型
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select length('hello');
      --返回int類型
    • Hive

      explain select length('hello');
      --返回int類型
  • LENGTHB

    普通模式下使用LENGTHB函數傳回值類型為BIGINT,Hive相容模式下使用LENGTHB函數傳回值類型為INT。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      explain select lengthb('hello');
      --返回bigint類型
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select lengthb('hello');
      --返回int類型
    • Hive不支援該函數。

  • LN

    當輸入參數超範圍時,同時為兩種模式開啟strict 模式(odps.function.strictmode=true),在普通模式下可能會報錯,在Hive相容模式下會返回NULL。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select ln(a) from values(-1.0) t(a);
      -- 報錯,輸入參數超出範圍
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select ln(a) from values(-1.0) t(a);
      -- 返回NULL
    • Hive

      select ln(-1.0) ;
      -- 返回NULL
  • LOCATE

    普通模式下使用LOCATE函數傳回值類型為BIGINT,Hive相容模式下使用LOCATE函數傳回值類型為INT。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      explain select locate('ab', 'abchelloabc');
      --返回bigint類型
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select locate('ab', 'abchelloabc');
      --返回int類型
    • Hive

      explain select locate('ab', 'abchelloabc');
      --返回的int類型
  • LOG

    當輸入參數超範圍時,同時為兩種模式開啟strict 模式(odps.function.strictmode=true),在普通模式下可能會報錯,在Hive相容模式下會返回NULL。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;     
      set odps.function.strictmode=true;     
      select log(a, 10) from values(-3.0) t(a);
      -- 報錯,輸入參數超出範圍
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select log(a, 10) from values(-3.0) t(a);
      -- 返回NULL
    • Hive

      select log(-3.0, 10) ;
      -- 返回NULL
  • MOD

    當輸入參數不合法時,同時為兩種模式開啟strict 模式(odps.function.strictmode=true),在普通模式下可能會報錯,在Hive相容模式下會返回NULL。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select  1L % a from values(0L) t(a);
      -- 報錯,資料溢出
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select  1L % a from values(0L) t(a);
      -- 返回NULL
    • Hive

      select  1L % 0L;
      -- 返回NULL
  • PMOD

    當輸入參數不合法時,同時為兩種模式開啟strict 模式(odps.function.strictmode=true),在普通模式下可能會報錯,在Hive相容模式下會返回NULL。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select pmod(1L, a) from values(0L) t(a);
      -- 報錯,資料溢出
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select pmod(1L, a) from values(0L) t(a);
      -- 返回NULL
    • Hive

      select pmod(1L, 0L) ;
      -- 返回NULL
  • POW

    當計算結果溢出時,同時為兩種模式開啟strict 模式(odps.function.strictmode=true),在普通模式下可能會報錯,在Hive相容模式下會返回INF。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strict.mode=true;
      select pow(a, 1000L) from values(1000L) t(a);
      -- 報錯,資料溢出
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strict.mode=true;
      select pow(a, 1000L) from values(1000L) t(a);
      -- 返回INF
    • Hive

      select pow(1000L, 1000L) ;
      -- 返回INF
  • REPEAT

    當REPEAT的個數小於零時,在普通模式下會報錯,在Hive相容模式下會返回Null 字元串。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select repeat('hi', n) from values (-1L) t(n);
      --報錯,輸入參數超出範圍
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select repeat('hi', n) from values (-1L) t(n);
      --返回Null 字元串
    • Hive不支援該函數。

  • REVERSE

    當輸入參數中包含中文字元時,在普通模式下按照位元組來進行reverse操作,傳回值可能有亂碼;在Hive相容模式下按照utf8來處理,不會出現亂碼。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select reverse(a) from values ('hello中國world') t(a);
      --返回結果中有亂碼
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select reverse(a) from values ('hello中國world') t(a);
      --返回結果中沒有亂碼
    • Hive

      select reverse('hello中國world') ;
      --返回dlrow國中olleh
  • ROUND

    在普通模式下使用ROUND函數,本質上只支援DOUBLE或DECIMAL兩種輸入資料類型,其他資料類型會轉換為這兩種類型;在Hive相容模式下,支援:DOUBLE、DECIMAL、BIGINT、INT、SMALLINT、TINYINT等資料類型。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      explain select round(a) from values(2L) t(a);
      --從執行計畫看,輸入資料從bigint類型轉換成double類型,計算結果是double類型
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select round(a) from values(2L) t(a);
      --從執行計畫看,輸入bigint類型,輸出是bigint類型
    • Hive

      explain select round(2L) ;
      --從執行計畫看,輸入bigint類型,輸出是bigint類型
  • SIGN

    • 輸入參數資料類型為DECIMAL時,普通模式下返回BIGINT類型,Hive相容模式下返回INT類型。

    • 輸入參數資料類型為DOUBLE時,普通模式下如果輸入參數的絕對值和0非常接近,則傳回值為0

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      
      set odps.sql.hive.compatible=false;         
      explain select sign(a) from values(cast(2 as decimal(10,0))) t(a);     
      --從執行計畫看,返回bigint類型         
      
      select sign(a) from values (0.000000000000009) t(a);     
      --傳回值是0.0,因為輸入參數和0非常接近
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      
      explain select sign(a) from values(2BD) t(a);
      --從執行計畫看,返回int類型
      
      select sign(a) from values (0.000000000000009) t(a);
      --傳回值是1.0
    • Hive

      explain select sign(2BD);
      --從執行計畫看,返回int類型
      
      select sign(0.000000000000009) ;
      --傳回值是1
  • SIZE

    • 普通模式下使用SIZE函數傳回值類型為BIGINT,Hive相容模式下使用SIZE函數傳回值類型為INT。

    • 輸入參數為NULL時,普通模式下返回NULL,Hive相容模式返回-1

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      explain select size(array('a','b'));
      --從執行計畫看,返回bigint類型
      
      select size(a) from values (cast(NULL as array<bigint>)) t(a);
      --返回結果是NULL
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      explain select size(array('a','b'));
      --從執行計畫看,返回int類型
      
      select size(a) from values (cast(NULL as array<bigint>)) t(a);
      --返回結果是-1
    • Hive

      explain select size(array('a','b'));
      --從執行計畫看,返回int類型
  • SPLIT

    當輸入參數的分隔字元為空白字串時,普通模式下返回空數組,Hive相容模式下按照UTF-8格式分割輸入字串。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      select split(a, '') from values ('hello中國world') t(a);
      --返回空array
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      select split(a, '') from values ('hello中國world') t(a);
      --返回[, h, e, l, l, o, 中, 國, w, o, r, l, d, ]
    • Hive

      select split('hello中國world', '') ;
      --返回["h","e","l","l","o","中","國","w","o","r","l","d",""]
  • SQRT

    當輸入參數小於0時,同時為兩種模式開啟strict 模式(odps.function.strictmode=true),在普通模式下可能會報錯,在Hive相容模式下會返回NULL。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select sqrt(a) from values (-100.0) t(a);
      -- 報錯,輸入參數小於0
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select sqrt(a) from values (-100.0) t(a);
      -- 返回NULL
    • Hive

      select sqrt(-100.0);
      -- 返回NULL
  • SUBSTR

    當輸入參數中的起始位置為0時,普通模式下返回Null 字元串,Hive相容模式下與起始位置為1時相同。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select substr(a, 0) from values ('hello, world') t(a);
      -- 返回Null 字元串
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select substr(a, 0) from values ('hello, world') t(a);
      -- 返回如下結果:
      +-----+
      | _c0 |
      +-----+
      | hello, world |
      +-----+
    • Hive

      select substr('hello, world', 0);
      -- 返回如下結果:
      +-----+
      | _c0 |
      +-----+
      | hello, world |
      +-----+
  • UNIX_TIMESTAMP

    普通模式下不支援兩個輸入參數類型為STRING,會報錯;Hive相容模式下支援兩個STRING類型的輸入參數,如下所示,傳回值為BIGINT類型,通過format指定時間格式,時間格式請參見SimpleDateFormat

    bigint FROM_UNIXTIME(string timeString, String format)

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      select unix_timestamp('99999-01-01 00:00:00');
      -- 報錯,輸入參數不合法
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      select unix_timestamp('99999-01-01 00:00:00');
      -- 返回NULL
    • Hive

      select unix_timestamp('2022/7/8', 'yyyy/MM/dd');
      --返回結果如下:
      +------------+
      | _c0        |
      +------------+
      | 1641571620 |
      +------------+
      select unix_timestamp('99999-01-01 00:00:00');
      --返回NULL
  • URL_DECODE

    當輸入參數不合法時,且同時為兩種模式開啟strict 模式(odps.function.strictmode=true),普通模式返回可能會報錯,Hive相容模式返回NULL。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      
      select url_decode(a) from values ('%2') t(a);
      -- 報錯,輸入參數不合法
                                  
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      
      select url_decode(a) from values ('%2') t(a);
      -- 返回NULL
                                  
    • Hive不支援該函數。

  • URL_ENCODE

    當輸入參數不合法或者轉換失敗時,且同時為兩種模式開啟strict 模式(odps.function.strictmode=true),普通模式返回可能會報錯,Hive相容模式返回NULL。

    樣本如下。

    • 普通模式

      set odps.sql.hive.compatible=false;
      set odps.function.strictmode=true;
      
      select url_encode(a, 'ascii') from values ('樣本') t(a);
      -- 報錯,輸入參數不合法
    • Hive相容模式

      set odps.sql.hive.compatible=true;
      set odps.function.strictmode=true;
      
      select url_encode(a, 'ascii') from values ('樣本') t(a);
      -- 返回NULL
    • Hive不支援該函數。