1. MaxCompute兼容模式
背景:CDH Hive作业迁移到MaxCompute,SQL语法多数相同,但是部分函数存在行为差异,使用compatible模式可以以Hive模式运行SQL,达到平迁、最小化改动、快速上云降低成本的目的。
相关hint:set odps.sql.hive.compatible=true;
2. 函数行为不同
2.1. unix_timestamp
- 【报错】Semantic analysis exception - function unix_timestamp cannot match any overloaded functions with (STRING)
- 【解决】Hive兼容模式运行或者更改函数的入参类型
2.2. udf
- 【报错】FAILED: ODPS-0130071:[9,8] Semantic analysis exception - invalid type org.apache.hadoop.io.Text for function UDF definition
- 【解决】Hive兼容模式运行或者重写udf
2.3. date_format
- 【报错】FAILED: ODPS-0121125:Not Support DatetimeFunc date_format(string, string) yet, please run in hive compatible mode
- 【解决】Hive兼容模式运行或者更改函数的入参类型
2.4. 除0溢出
- 【报错】FAILED: ODPS-0121145:Data overflow - Div result is nan, two params are 0.000000 and 0.000000
- 【解决】Hive兼容模式返回INF,落表为null,ODPS则会报错如上所示。可以无脑加compatible保持原hive逻辑执行的策略。
2.5. from_unixtime
- odps与hive语法参数不同,hive可以通过第二个参数指定format返回string,odps默认ymd-hms的返回,要根据format看下是否要添加date_format(, string ),或者直接无脑compatible模式
- odps与hive函数返回类型不同,odps为datetime,hive为string,这个不用管,datetime类型落表会转换为string
-- hivefrom_unixtime(unix_timestamp(concat(translate(order_date,'/','-'),' 00:00:00')),'yyyy-MM-dd')as order_date,-- odpsdate_format(from_unixtime(unix_timestamp(concat(translate(order_date,'/','-'),' 00:00:00'))),'yyyy-MM-dd')as order_date,
2.6. ucase
- 【报错】FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: StdException:ScalarFnCall::doCodegen fail, scalar function name: UCASE, funcSig: S_S_
- 【解决】hive ucase同toupper
-- hive,ucase(t.store_no)-- odps,toupper(t.store_no)
2.7. 正则相关,如:regexp_replace
- 从报错信息看,} 前面的四个转义符 \\\\,转义之后还有两个\\,实际是不需要4个转义符的,2个即可。如图二所示。原脚本中使用4个转义符,目前判断和set -e方式执行SQL有关系,那种方式相当于转义两次,故需要4个转义符。
- MaxCompute正则表达式规范及注意事项参考:https://help.aliyun.com/zh/maxcompute/user-guide/regular-expressions?spm=a2c4g.11186623.0.i14
2.8. substring
- hive的起始index是0,odps的起始是1,如果为0,则返回null,sql不会报错,但是数据结果会不符合预期,主要表现在截取字段进行关联时,inner join后input size为0。