普通和hive兼容模式下sql的差异
–odps sql
––
–author:宋文理
–create time:2023-03-08 15:23:52
––
– 差异分为三块
– 1.运算符的差异
– 2.类型转换的差异
– 3.内建函数的差异
– 以下是运算符的差异:
– BITAND(&)
– 当输入参数是BIGINT类型的时候,如果BITAND的计算结果是LONG_MIN(-263),在普通模式下会返回NULL,
– 而Hive模式仍然是LONG_MIN。
select cast((3&5)as string); --返回1
– 示例如下
– 普通模式
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
select cast((-9 & -2) as string); --返回-10
select cast((-2 & -3)as string); --返回-4
select cast((1 & 2)as string); --返回0
select cast((-2 & -3)as string); --返回-4
select cast((-2 & -3)as string); --返回-4
select cast(-2 as string);
INSERT overwrite TABLE ods_std_wxthct_tbv_trandetailcount_di partition (ds = ‘bdp.system.bizdate′)selectDEPTID,TRANID,ARTIID,DEALID,STKLOCID,TRANCOUNTID,PROVID,COUNTDATE,TRANDATE,CLDATE,CLOPTRID,CLCHECKOPTRIDfromodsstgwxthcttbvtrandetailcountdiawherecast(a.DEPTIDasbigint)>0andcast(a.ARTIIDasbigint)>0anda.ds=′{bdp.system.bizdate}') select DEPTID ,TRANID ,ARTIID ,DEALID ,STKLOCID ,TRANCOUNTID ,PROVID ,COUNTDATE ,TRANDATE ,CLDATE ,CLOPTRID ,CLCHECKOPTRID from ods_stg_wxthct_tbv_trandetailcount_di a where cast(a.DEPTID as bigint)>0 and cast(a.ARTIID as bigint)>0 and a.ds = 'bdp.system.bizdate′)selectDEPTID,TRANID,ARTIID,DEALID,STKLOCID,TRANCOUNTID,PROVID,COUNTDATE,TRANDATE,CLDATE,CLOPTRID,CLCHECKOPTRIDfromodsstgwxthcttbvtrandetailcountdiawherecast(a.DEPTIDasbigint)>0andcast(a.ARTIIDasbigint)>0anda.ds=′{bdp.system.bizdate}’;
– 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
select cast((a | b) as string) from
values(8,1) t(a, b); --返回9
select cast((a | b) as string) from
values(8,6) t(a, b); --返回14
select cast((a | b) as string) from
values(8,-1) t(a, b); --返回-1
– 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);
select 1.0=1.0000000000000000000000001;
– 结果是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兼容模式计算结果溢出不会报错,
– 同时为两种模式开启严格模式(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兼容模式计算结果溢出不会报错,
– 同时为两种模式开启严格模式(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兼容模式计算结果溢出不会报错,
– 同时为两种模式开启严格模式(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兼容模式计算结果溢出不会报错,
– 同时为两种模式开启严格模式(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,
– 同时为两种模式开启即严格模式(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,
– 同时为两种模式开启即严格模式(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.sql.udf.strict.mode=true;
select cast(a as decimal) from values (‘hello’) t(a);
– 返回NULL
– Hive
select cast(‘hello’ as decimal) ;
– 返回NULL
– TODOUBLE
– 当输入参数不合法时,普通模式下可能会报错,Hive兼容模式返回NULL,
– 同时为两种模式开启即严格模式(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,
– 同时为两种模式开启即严格模式(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,
– 同时为两种模式开启即严格模式(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兼容模式返回空字符串。
– 示例如下。
– 普通模式
set odps.sql.hive.compatible=false;
select chr(-100L);
–报错,输入参数不合法
– Hive兼容模式
set odps.sql.hive.compatible=true;
select chr(-100L);
–返回空字符串
– Hive
select chr(-100L);
–返回空字符串
CONCAT_WS
– 输入参数中有NULL,普通模式与Hive模式的返回结果不同。普通模式返回NULL,而Hive兼容模式会忽略输入参数中的NULL。
– 输入参数中有空数组,如下所示。普通模式下会返回NULL,而Hive兼容模式下会返回空字符串。
– string concat_ws(string , array 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());
–返回空字符串
– Hive
select concat_ws(‘,’, ‘a’, null, ‘b’);
– 返回如下值:
±----+
| _c0 |
±----+
| a,b |
±----+
select concat_ws(‘,’, array());
–返回空字符串
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
– 当使用EXP函数计算的结果超出输出类型的值域范围时,同时为两种模式开启严格模式(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
– 当输入参数超范围时,且同时为两种模式开启严格模式(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_encoding和to_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
– 当输入参数超范围时,同时为两种模式开启严格模式(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
– 当输入参数超范围时,同时为两种模式开启严格模式(odps.function.strictmode=true),
– 在普通模式下可能会报错,在Hive兼容模式下会返回NULL。
– 示例如下。
– 普通模式
set odps.sql.hive.compatible=false;
set oodps.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
– 当输入参数不合法时,同时为两种模式开启严格模式(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
– 当输入参数不合法时,同时为两种模式开启严格模式(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
– 当计算结果溢出时,同时为两种模式开启严格模式(odps.function.strictmode=true),
– 在普通模式下可能会报错,在Hive兼容模式下会返回INF。
– 示例如下。
– 普通模式
– set odps.sql.hive.compatible=false;
set odps.sql.udf.strict.mode=true;
select pow(a, 1000L) from values(1000L) t(a);
– 报错,数据溢出
– Hive兼容模式
set odps.sql.hive.compatible=true;
set odps.sql.udf.strict.mode=true;
select pow(a, 1000L) from values(1000L) t(a);
– 返回INF
– Hive
select pow(1000L, 1000L) ;
– 返回INF
REPEAT
– 当REPEAT的个数小于零时,在普通模式下会报错,在Hive兼容模式下会返回空字符串。
– 示例如下。
– 普通模式
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);
– --返回空字符串
– 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;
explain select sign(a) from values(2BD) 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)) 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)) 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时,同时为两种模式开启严格模式(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时,普通模式下返回空字符串,Hive兼容模式下与起始位置为1时相同。
– 示例如下。
– 普通模式
set odps.sql.hive.compatible=false;
set odps.function.strictmode=true;
select substr(a, 0) from values (‘hello, world’) t(a);
– 返回空字符串
– 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(a) from values (‘99999-01-01 00:00:00’);
– 报错,输入参数不合法
– Hive兼容模式
set odps.sql.hive.compatible=true;
set odps.function.strictmode=true;
select unix_timestamp(a) from values (‘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’) ;
–返回:3093496416000
select unix_timestamp(‘99999-01-01 00:00:00’);
–返回:3093496416000
URL_DECODE
– 当输入参数不合法时,且同时为两种模式开启严格模式(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
– 当输入参数不合法或者转换失败时,且同时为两种模式开启严格模式(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不支持该函数。
相关文章:
普通和hive兼容模式下sql的差异
–odps sql –– –author:宋文理 –create time:2023-03-08 15:23:52 –– – 差异分为三块 – 1.运算符的差异 – 2.类型转换的差异 – 3.内建函数的差异 – 以下是运算符的差异: – BITAND(&) – 当输入参数是BIGINT类型的时候&…...

github开源自己代码
接下来,我们需要先下载Git,的网址:https://git-scm.com/downloads,安装时如果没有特殊需求,一直下一步就可以了,安装完成之后,双击打开Git Bash 出现以下界面: 第一步:…...

数据库基础语法
sql(Structured Query Language 结构化查询语言) SQL语法 use DataTableName; 命令用于选择数据库。set names utf8; 命令用于设置使用的字符集。SELECT * FROM Websites; 读取数据表的信息。上面的表包含五条记录(每一条对应一个网站信息&…...

【Java】期末复习知识点总结(4)
适合Java期末的复习~ (Java期末复习知识点总结分为4篇,这里是最后一篇啦)第一篇~https://blog.csdn.net/qq_53869058/article/details/129417537?spm1001.2014.3001.5501第二篇~https://blog.csdn.net/qq_53869058/article/details/1294751…...

IDEA好用插件:MybatisX快速生成接口实体类mapper.xml映射文件
目录 1、在Idea中找到下载插件,Install,重启Idea 2、一个测试java文件,里面有com包 3、在Idea中添加数据库 --------以Oracle数据库为例 4、快速生成entity-service-mapper方法 5、查看生成的代码 6、自动生成(增删查改࿰…...

【JavaEE】初识线程
一、简述进程认识线程之前我们应该去学习一下“进程" 的概念,我们可以把一个运行起来的程序称之为进程,进程的调度,进程的管理是由我们的操作系统来管理的,创建一个进程,操作系统会为每一个进程创建一个 PCB&…...

智慧水务监控系统-智慧水务信息化平台建设
平台概述柳林智慧水务监控系统(智慧水务信息化平台)是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算法、虚拟现实技术为核心,以监测仪表、通讯网络、数据库系统、数据中台、模型软件、前台展示、智慧运维等产品体系为…...

【Linux】进程优先级前后台理解
环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹相关文章推荐:【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习(Ⅰ)浅谈Linux下的shell--BASH【Linux…...

时序预测 | MATLAB实现基于EMD-GRU时间序列预测(EMD分解结合GRU门控循环单元)
时序预测 | MATLAB实现基于EMD-GRU时间序列预测(EMD分解结合GRU门控循环单元) 目录 时序预测 | MATLAB实现基于EMD-GRU时间序列预测(EMD分解结合GRU门控循环单元)效果一览基本描述模型描述程序设计参考资料效果一览...
python 模拟鼠标,键盘点击
信息爆炸 消息轰炸模拟鼠标和键盘敲击import time from pynput.keyboard import Controller as key_col from pynput.mouse import Button,Controller def keyboard_input(insertword):keyboardkey_col()keyboard.type(insertword)def mouth():mouseController()mouse.press(…...

【CSS】盒子边框 ③ ( 设置表格细线边框 | 合并相邻边框 border-collapse: collapse; )
文章目录一、设置表格细线边框1、表格示例2、合并相邻边框3、完整代码示例一、设置表格细线边框 1、表格示例 给定一个 HTML 结构中的表格 , 默认样式如下 : <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" />…...
TensorRT量化工具pytorch_quantization代码解析(一)
量化工具箱pytorch_quantization 通过提供一个方便的 PyTorch 库来补充 TensorRT ,该库有助于生成可优化的 QAT 模型。该工具包提供了一个 API 来自动或手动为 QAT 或 PTQ 准备模型。 API 的核心是 TensorQuantizer 模块,它可以量化、伪量化或收集张量的…...

【Kubernetes】第二十七篇 - 布署前端项(下)
一,前言 上一篇,介绍了前端项目的部署:项目的创建和 jenkins 配置; 本篇,创建 Deployment、Service,完成前端项目的部署; 二,创建 Deployment 创建 Deployment 配置文件ÿ…...

【MFC】两个ListBox控件数据交互
一.控件ID名称 界面如图下所示: 候选数据列表的ID为: 已选数据列表的ID为: 二.数据添加 可以使用以下代码往框中添加数据: ((CListBox *)GetDlgItem(IDC_LIST_TO_CHO))->AddString("测试数据"); 显示效果如下&#…...
sklearn库学习--SelectKBest 、f_regression
目录 一、SelectKBest 介绍、代码使用 介绍: 代码使用: 二、评分函数 【1】f_regression: (1)介绍: (2)F值和相关系数 【2】除了f_regression函数,还有一些适用于…...
蓝桥杯刷题第十三天
第一题:特殊日期问题描述对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 11 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数…...
CPU 和带宽之间的时空权衡
在 从一道面试题看 TCP 的吞吐极限 一文的开始,我提到在环形域上两个数字比较大小的前提是在同一个半圆内,进而得到滑动窗口最大值被限定在一个环形域的一半。 现在来看更为基本的问题。如果序列号只有 2bit,甚至仅有 1bit,保序传…...

ES+Redis+MySQL,这个高可用架构设计太顶了!
一、背景 会员系统是一种基础系统,跟公司所有业务线的下单主流程密切相关。如果会员系统出故障,会导致用户无法下单,影响范围是全公司所有业务线。所以,会员系统必须保证高性能、高可用,提供稳定、高效的基础服务。 …...

【Maven】Maven的常用命令
目录 一、Maven的常用命令 1、compile 编译命令 2、test 测试命令 3 、clean 清理命令 4、package 打包命令 5、 install 安装命令 6、Maven 指令的生命周期 二、maven 的概念模型 💟 创作不易,不妨点赞💚评论❤️收藏💙一…...
python的循环结构
python中有for循环和while循环两种形式。 1. for 循环 可以用for循环来遍历不同类型的对象,如数组、列表、元组、字典、集合或字符串,并对每个元素执行一段代码。 1.1 数组的for循环 用for循环遍历一个数组,并打印出每个元素:…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...