普通和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循环遍历一个数组,并打印出每个元素:…...
就业指导|中九非科班毕业,华为 OD 做 Java 后端想转 C++,能找到深度学习挂钩的岗工作吗?
这类题最容易让人一下把难度叠得太高。 因为你实际上不是只在做一次转向。 你想做的是三件事同时发生: 从 Java 后端转 C 还想和深度学习挂钩 最好岗位还能成立 问题就在这里。 这三个目标不是完全冲突。 但如果你把它理解成: “我直接转去做纯 …...
避坑指南:STM32F407的DAC输出Buffer为啥会导致0V?ADC连续转换模式与DMA配置的细节解析
STM32F407模拟信号处理实战:DAC输出与ADC采样的深度避坑指南 1. 从异常现象到原理剖析:DAC输出Buffer的隐藏陷阱 调试STM32F407的DAC外设时,不少开发者都遇到过这样的困惑:明明配置了正确的数值,输出电压却始终为0V。…...
从0到1:如何用MNBVC超大规模中文语料库训练你的中文大模型
从0到1:如何用MNBVC超大规模中文语料库训练你的中文大模型 【免费下载链接】MNBVC MNBVC(Massive Never-ending BT Vast Chinese corpus)超大规模中文语料集。对标chatGPT训练的40T数据。MNBVC数据集不但包括主流文化,也包括各个小众文化甚至火星文的数据…...
2026年电工杯A 题 绿电直连型电氢氨园区优化运行【思路、Python代码、Matlab代码、论文(持续更新中......)】
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
从游戏存档黑盒到透明编辑:uesave工具实战指南
从游戏存档黑盒到透明编辑:uesave工具实战指南 【免费下载链接】uesave Rust library and CLI to read and write Unreal Engine save files 项目地址: https://gitcode.com/gh_mirrors/ue/uesave 你是否曾经面对游戏存档文件感到束手无策?那些神…...
嵌入式开发通用工具包设计:提升效率与代码质量的核心架构
1. 项目概述:为什么嵌入式开发需要一个“工具箱”?干了十几年嵌入式,从8位单片机玩到多核ARM Cortex-A,我最大的感受就是:重复造轮子和调试效率低下是拖慢项目进度的两大元凶。每次新项目启动,都得重新搭建…...
主芯片LP3717BTT+LP3568C,5V3.1A过认证适配器⽅案(电路原理图)
LP3717BTT LP3568C 是一套 5V/3.1A(15.5W)隔离型反激电源方案,主打"过认证、高效率、低温度"。LP3717BTT 是原边 PWM 控制器,LP3568C 是次级同步整流芯片,两者配合实现高精度恒压输出,板端效率可…...
Claude Mythos:AI自主攻防与零日漏洞发现的范式革命
1. 项目概述:一场静默却震耳欲聋的AI能力跃迁这周,整个AI安全圈没有爆炸性新闻稿,没有铺天盖地的发布会直播,只有一份措辞克制、数据密集的系统卡片(System Card)和一份由英国AI安全研究所(AISI…...
紧急更新|Midjourney即将下线--blueprint实验性指令!最后48小时掌握蓝晒法风格不可逆生成逻辑
更多请点击: https://intelliparadigm.com 第一章:Midjourney蓝晒法风格的底层视觉基因解码 蓝晒法(Cyanotype)作为19世纪诞生的古典摄影工艺,其视觉基因并非仅由普鲁士蓝染料决定,而是一套由化学反应、物…...
