本文為您介紹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); --返回NULLHive相容模式
set odps.sql.hive.compatible=true; select cast((a & b) as string) from values(-9223372036854775807L, -9223372036854775792L) t(a, b); --返回-9223372036854775808Hive
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); --返回NULLHive相容模式
set odps.sql.hive.compatible=true; select cast((a | b) as string) from values(java.lang.Long.MIN_VALUE, 0L) t(a, b); --返回-9223372036854775808Hive
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); --返回NULLHive相容模式
set odps.sql.hive.compatible=true; select cast((a ^ b) as string) from values(java.lang.Long.MIN_VALUE, 0L) t(a, b); --返回-9223372036854775808Hive
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); -- 結果是falseHive
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); -- 結果是trueHive
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); -- 結果是falseHive
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); -- 結果是trueHive
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); -- 結果是falseHive
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); -- 結果是trueHive
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); -- 返回NULLHive
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); -- 返回NULLHive
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); -- 返回NULLHive
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); -- 返回NULLHive
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); --返回NANHive
select acos(1.5); --返回NAN
ASCII
普通模式ASCII函數傳回值類型為BIGINT,Hive相容模式ASCII函數傳回值類型為INT。
樣本如下。
普通模式
set odps.sql.hive.compatible=false; explain select ascii('abcde'); --顯示傳回值類型是bigintHive相容模式
set odps.sql.hive.compatible=true; explain select ascii('abcde'); --顯示傳回值類型是intHive
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); --返回NANHive
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); --顯示傳回值類型是bigintHive相容模式
set odps.sql.hive.compatible=true; explain select ceil(1.2BD); --顯示傳回值類型是decimalHive
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()); -- 返回NULLHive相容模式
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); --返回INFHive不支援此函數。
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 overflowHive相容模式
set odps.sql.hive.compatible=true; set odps.function.strictmode=true; select exp(a) from values (1000L) t(a); -- 返回INFHive
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'); --顯示傳回值類型是bigintHive相容模式
set odps.sql.hive.compatible=true; explain select find_in_set('ab', 'abc,hello,ab,c'); --顯示傳回值類型是intHive
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); --顯示傳回值類型是bigintHive相容模式
set odps.sql.hive.compatible=true; explain select floor(1.2BD); --顯示傳回值類型是decimalHive
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'); -- 返回NULLHive
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'); --傳回值類型是bigintHive相容模式
set odps.sql.hive.compatible=true; explain select hash(0, 2, 4); --傳回值類型是intHive
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_encoding和to_encoding編碼,結果才返回false。
樣本如下。
普通模式
set odps.sql.hive.compatible=false; select is_encoding('中文', 'gbk', 'utf-8'); -- 返回false,'中文'是utf-8編碼,不能用gbk解碼,所以返回falseHive相容模式
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); -- 返回NULLHive
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); -- 返回NULLHive
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); -- 返回NULLHive
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); -- 返回NULLHive
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); -- 返回INFHive
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.0Hive
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); --返回結果是NULLHive相容模式
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); --返回結果是-1Hive
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); --返回空arrayHive相容模式
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); -- 報錯,輸入參數小於0Hive相容模式
set odps.sql.hive.compatible=true; set odps.function.strictmode=true; select sqrt(a) from values (-100.0) t(a); -- 返回NULLHive
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'); -- 返回NULLHive
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); -- 返回NULLHive不支援該函數。
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); -- 返回NULLHive不支援該函數。