网站建设上传视频教程,wordpress黑色主题,顺的网站建设报价,虚拟网站–odps sql –– –author:宋文理 –create time:2023-03-08 15:23:52 –– – 差异分为三块 – 1.运算符的差异 – 2.类型转换的差异 – 3.内建函数的差异
– 以下是运算符的差异#xff1a;
– BITAND#xff08;#xff09; – 当输入参数是BIGINT类型的时候…–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((35)as string); --返回1 – 示例如下 – 普通模式 set odps.sql.hive.compatiblefalse; select cast((a b) as string) from values(-9223372036854775807L, -9223372036854775792L) t(a, b); –返回NULL
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; 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.compatibletrue; 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.compatiblefalse; select cast((a ^ b) as string) from values(java.lang.Long.MIN_VALUE, 0L) t(a, b); –返回NULL
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; select a 1.0 from values (1.000000000000001) t(a); select 1.01.0000000000000000000000001; – 结果是true因为这两个数足够接近
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; select a ! 1.0 from values (1.000000000000001) t(a); – 结果是false因为这两个数足够接近
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; select 1.0 a from values (1.000000000000001) t(a); – 结果是true因为这两个数足够接近认为它们相等
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; select a 1.0 from values (1.000000000000001) t(a); – 结果是false因为这两个数足够接近认为它们相等
– Hive兼容模式 set odps.sql.hive.compatibletrue; select a 1.0 from values (1.000000000000001) t(a); – 结果是true – Hive select 1.0000000000000011.0; – 结果是true
– LE – 当输入参数是DOUBLE类型的时候普通模式下对相等的检查更加宽松如果两个输入参数足够接近 – 就认为它们相等这会导致即使第1个输入参数大于第2个参数但是只要他们足够接近LE的返回结果也可能是true。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; select a 1.0 from values (1.000000000000001) t(a); – 结果是true因为这两个数足够接近认为它们相等
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; select 1.0 a from values (1.000000000000001) t(a); – 结果是false因为这两个数足够接近认为它们相等
– Hive兼容模式 set odps.sql.hive.compatibletrue; select 1.0 a from values (1.000000000000001) t(a); – 结果是true – Hive select 1.0 1.000000000000001; – 结果是true – PLUS – 计算结果超范围时的处理不同在普通模式时可能会报错在Hive兼容模式计算结果溢出不会报错 – 同时为两种模式开启严格模式odps.function.strictmodetrue。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select (100L a) from values (9223372036854775807L) t(a); – 报错计算结果溢出
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select (100L a) from values (9223372036854775807L) t(a); – 计算结果溢出但是不会报错 – Hive select (100L 9223372036854775807L) ; – 返回-9223372036854775709计算结果溢出但是不会报错
– MINUS- – 计算结果超范围时的处理不同在普通模式时可能会报错在Hive兼容模式计算结果溢出不会报错 – 同时为两种模式开启严格模式odps.function.strictmodetrue。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select (-100L - a) from values (9223372036854775807L) t(a); – 报错计算结果溢出
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select (-100L - a) from values (9223372036854775807L) t(a); – 计算结果溢出但是不会报错 – Hive select (-100L - 9223372036854775807L) ; – 返回 9223372036854775709 – MPL* – 计算结果超范围时的处理不同在普通模式时可能会报错在Hive兼容模式计算结果溢出不会报错 – 同时为两种模式开启严格模式odps.function.strictmodetrue。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select (a * 9223372036854775807L) from values (9223372036854775807L) t(a); – 报错计算结果溢出
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select (a * 9223372036854775807L) from values (9223372036854775807L) t(a); – 计算结果溢出但是不会报错 – Hive select (9223372036854775807L * 9223372036854775807L) ; – 返回1计算结果溢出但是不会报错 – – DIV/ – 计算结果超范围时的处理不同在普通模式时可能会报错在Hive兼容模式计算结果溢出不会报错 – 同时为两种模式开启严格模式odps.function.strictmodetrue。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue;
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.compatibletrue; set odps.function.strictmodetrue;
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.strictmodetrue。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select cast(a as bigint) from values (‘hello’) t(a); – 报错输入参数不合法
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select cast(a as bigint) from values (‘hello’) t(a); – 返回NULL – Hive select cast(‘hello’ as bigint) ; – 返回NULL – TODECIMAL – 当输入参数不合法时普通模式下可能会报错Hive兼容模式返回NULL – 同时为两种模式开启即严格模式odps.function.strictmodetrue。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select cast(a as decimal) from values (‘hello’) t(a); – 报错输入参数不合法
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.sql.udf.strict.modetrue; select cast(a as decimal) from values (‘hello’) t(a); – 返回NULL – Hive select cast(‘hello’ as decimal) ; – 返回NULL – TODOUBLE – 当输入参数不合法时普通模式下可能会报错Hive兼容模式返回NULL – 同时为两种模式开启即严格模式odps.function.strictmodetrue。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select cast(a as double) from values (‘hello’) t(a); – 报错输入参数不合法
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select cast(a as double) from values (‘hello’) t(a); – 返回NULL – Hive select cast(‘hello’ as double) ; – 返回NULL – TOSMALLINT – 当输入参数不合法或超出范围时普通模式下可能会报错Hive兼容模式返回NULL – 同时为两种模式开启即严格模式odps.function.strictmodetrue。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; set odps.sql.type.system.odps2true;
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.compatibletrue; set odps.function.strictmodetrue; set odps.sql.type.system.odps2true;
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.strictmodetrue。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; set odps.sql.type.system.odps2true;
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.compatibletrue; set odps.function.strictmodetrue; set odps.sql.type.system.odps2true;
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.compatiblefalse; select acos(a) from values(1.5) t(a); –返回NULL并且有可能会报错
– Hive兼容模式 set odps.sql.hive.compatibletrue; select acos(a) from values(1.5) t(a); –返回NAN – Hive select acos(1.5); –返回NAN
ASCII – 普通模式ASCII函数返回值类型为BIGINTHive兼容模式ASCII函数返回值类型为INT。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; explain select ascii(‘abcde’); –显示返回值类型是bigint
– Hive兼容模式 set odps.sql.hive.compatibletrue; explain select ascii(‘abcde’); –显示返回值类型是int – Hive explain select ascii(‘abcde’); –显示返回值类型是int
ASIN – 取值超出范围[-1,1]时普通模式和Hive模式的表现不同。普通模式返回NULL并且可能会报错而Hive模式返回NAN。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; select asin(a) from values(1.5) t(a); –返回NULL并且有可能会报错
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; explain select ceil(1.2BD); –显示返回值类型是bigint
– Hive兼容模式 set odps.sql.hive.compatibletrue; explain select ceil(1.2BD); –显示返回值类型是decimal – Hive explain select ceil(1.2BD); –显示返回值类型是decimal(2,0) – CHR – 输入参数取值超出范围普通模式与Hive模式的返回结果不同。 – 普通模式会报错而Hive兼容模式返回空字符串。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; select chr(-100L); –报错输入参数不合法 – Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; select concat_ws(‘,’, ‘a’, null, ‘b’); – 返回NULL select concat_ws(‘,’, array()); – 返回NULL
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; select cot(a) from values(0.0) t(a); –返回NULL并且有可能会报错
– Hive兼容模式 set odps.sql.hive.compatibletrue; select cot(a) from values(0.0) t(a); –返回INF – Hive不支持此函数。
EXP – 当使用EXP函数计算的结果超出输出类型的值域范围时同时为两种模式开启严格模式odps.function.strictmodetrue – 在普通模式下可能会报错而Hive兼容模式返回INF。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select exp(a) from values (1000L) t(a); – 报错 Data overflow
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select exp(a) from values (1000L) t(a); – 返回INF – Hive select exp(1000L) ; – 返回INF
FIND_IN_SET – 普通模式FIND_IN_SET函数返回值类型为BIGINTHive兼容模式FIND_IN_SET函数返回值类型为INT。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; explain select find_in_set(‘ab’, ‘abc,hello,ab,c’); –显示返回值类型是bigint
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; explain select floor(1.2BD); –显示返回值类型是bigint
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse;
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.compatibletrue;
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.strictmodetrue – 普通模式返回可能会报错Hive兼容模式返回NULL。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select from_utc_timestamp(1501557840000000, ‘UTC’); – 报错输入参数超出范围
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; 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.compatiblefalse; explain select hash(0, 2, 4); –返回值类型是bigint
– Hive兼容模式 set odps.sql.hive.compatibletrue; explain select hash(0, 2, 4); –返回值类型是int – Hive explain select hash(0, 2, 4); –返回值类型是int
IS_ENCODING – 判断输入的字符串是否可以从指定的一个字符集from_encoding转为另一个字符集to_encoding。也可以用于判断输入是否为乱码 – 通常您可以将from_encoding设为UTF-8to_encoding设为GBK。 – 普通模式下输入字符串必须要能够用from_encoding解码成功并能按照to_encoding编码结果才能返回false。 – Hive兼容模式下输入字符串必须是UTF-8编码并且需要能同时被from_encoding和to_encoding编码结果才返回false。 – 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; select is_encoding(‘中文’, ‘gbk’, ‘utf-8’); – 返回false中文’是utf-8编码不能用gbk解码所以返回false
– Hive兼容模式 set odps.sql.hive.compatibletrue; select is_encoding(‘中文’, ‘gbk’, ‘utf-8’); – 返回true中文’既可以转换成gbk编码又可以转换成utf-8编码 – Hive不支持此语法。
INSTR – 输入参数为两个字符串时普通模式下返回值类型为BIGINTHive兼容模式下返回值类型为INT。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; explain select instr(‘Tech on the net’, ‘e’); –返回bigint类型
– Hive兼容模式 set odps.sql.hive.compatibletrue; explain select instr(‘Tech on the net’, ‘e’); –返回int类型 – Hive explain select instr(‘Tech on the net’, ‘e’); –返回的是int类型
LENGTH – 普通模式下使用LENGTH函数返回值类型为BIGINTHive兼容模式下使用LENGTH函数返回值类型为INT。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; explain select length(‘hello’); –返回bigint类型 – Hive兼容模式 set odps.sql.hive.compatibletrue; explain select length(‘hello’); –返回int类型 – Hive explain select length(‘hello’); –返回int类型
LENGTHB – 普通模式下使用LENGTHB函数返回值类型为BIGINTHive兼容模式下使用LENGTHB函数返回值类型为INT。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; explain select lengthb(‘hello’); –返回bigint类型
– Hive兼容模式 set odps.sql.hive.compatibletrue; explain select lengthb(‘hello’); –返回int类型 – Hive不支持该函数。
LN – 当输入参数超范围时同时为两种模式开启严格模式odps.function.strictmodetrue – 在普通模式下可能会报错在Hive兼容模式下会返回NULL。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select ln(a) from values(-1.0) t(a); – 报错输入参数超出范围
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select ln(a) from values(-1.0) t(a); – 返回NULL – Hive select ln(-1.0) ; – 返回NULL
LOCATE – 普通模式下使用LOCATE函数返回值类型为BIGINTHive兼容模式下使用LOCATE函数返回值类型为INT。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; explain select locate(‘ab’, ‘abchelloabc’); –返回bigint类型
– Hive兼容模式 set odps.sql.hive.compatibletrue; explain select locate(‘ab’, ‘abchelloabc’); –返回int类型 – Hive explain select locate(‘ab’, ‘abchelloabc’); –返回的int类型 LOG – 当输入参数超范围时同时为两种模式开启严格模式odps.function.strictmodetrue – 在普通模式下可能会报错在Hive兼容模式下会返回NULL。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set oodps.function.strictmodetrue; select log(a, 10) from values(-3.0) t(a); – 报错输入参数超出范围
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select log(a, 10) from values(-3.0) t(a); – 返回NULL – Hive select log(-3.0, 10) ; – 返回NULL
MOD – 当输入参数不合法时同时为两种模式开启严格模式odps.function.strictmodetrue – 在普通模式下可能会报错在Hive兼容模式下会返回NULL。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select 1L % a from values(0L) t(a); – 报错数据溢出
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select 1L % a from values(0L) t(a); – 返回NULL – Hive select 1L % 0L; – 返回NULL
PMOD – 当输入参数不合法时同时为两种模式开启严格模式odps.function.strictmodetrue – 在普通模式下可能会报错在Hive兼容模式下会返回NULL。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select pmod(1L, a) from values(0L) t(a); – 报错数据溢出
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select pmod(1L, a) from values(0L) t(a); – 返回NULL
– Hive select pmod(1L, 0L) ; – 返回NULL – POW – 当计算结果溢出时同时为两种模式开启严格模式odps.function.strictmodetrue – 在普通模式下可能会报错在Hive兼容模式下会返回INF。
– 示例如下。 – 普通模式 – set odps.sql.hive.compatiblefalse; set odps.sql.udf.strict.modetrue; select pow(a, 1000L) from values(1000L) t(a); – 报错数据溢出
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.sql.udf.strict.modetrue; select pow(a, 1000L) from values(1000L) t(a); – 返回INF – Hive select pow(1000L, 1000L) ; – 返回INF
REPEAT – 当REPEAT的个数小于零时在普通模式下会报错在Hive兼容模式下会返回空字符串。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; select repeat(‘hi’, n) from values (-1L) t(n); –报错输入参数超出范围
– Hive兼容模式 set odps.sql.hive.compatibletrue; select repeat(‘hi’, n) from values (-1L) t(n); – --返回空字符串 – Hive不支持该函数。
REVERSE – 当输入参数中包含中文字符时在普通模式下按照字节来进行reverse操作返回值可能有乱码 – 在Hive兼容模式下按照utf8来处理不会出现乱码。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; select reverse(a) from values (‘hello中国world’) t(a); –返回结果中有乱码
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; explain select round(a) from values(2L) t(a); –从执行计划看输入数据从bigint类型转换成double类型计算结果是double类型
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse;
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.compatibletrue;
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函数返回值类型为BIGINTHive兼容模式下使用SIZE函数返回值类型为INT。 – 输入参数为NULL时普通模式下返回NULLHive兼容模式返回-1。 – 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; explain select size(array(‘a’,‘b’)); –从执行计划看返回bigint类型
select size(a) from values (cast(NULL as array)) t(a); –返回结果是NULL
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.compatiblefalse; select split(a, ‘’) from values (‘hello中国world’) t(a); –返回空array
– Hive兼容模式 set odps.sql.hive.compatibletrue; 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.strictmodetrue – 在普通模式下可能会报错在Hive兼容模式下会返回NULL。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select sqrt(a) from values (-100.0) t(a); – 报错输入参数小于0
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; select sqrt(a) from values (-100.0) t(a); – 返回NULL Hive select sqrt(-100.0); – 返回NULL
SUBSTR – 当输入参数中的起始位置为0时普通模式下返回空字符串Hive兼容模式下与起始位置为1时相同。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue; select substr(a, 0) from values (‘hello, world’) t(a); – 返回空字符串
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; 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.compatiblefalse; set odps.function.strictmodetrue; select unix_timestamp(a) from values (‘99999-01-01 00:00:00’); – 报错输入参数不合法
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue; 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.strictmodetrue – 普通模式返回可能会报错Hive兼容模式返回NULL。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue;
select url_decode(a) from values (‘%2’) t(a); – 报错输入参数不合法
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue;
select url_decode(a) from values (‘%2’) t(a); – 返回NULL
– Hive不支持该函数。 URL_ENCODE – 当输入参数不合法或者转换失败时且同时为两种模式开启严格模式odps.function.strictmodetrue – 普通模式返回可能会报错Hive兼容模式返回NULL。
– 示例如下。 – 普通模式 set odps.sql.hive.compatiblefalse; set odps.function.strictmodetrue;
select url_encode(a, ‘ascii’) from values (‘示例’) t(a); – 报错输入参数不合法
– Hive兼容模式 set odps.sql.hive.compatibletrue; set odps.function.strictmodetrue;
select url_encode(a, ‘ascii’) from values (‘示例’) t(a); – 返回NULL – Hive不支持该函数。