ODPS2.0语言升级和兼容问题

问题一:invalid.column.name

在引用一个column时候, LOT模式支持.., 其中这一字段实际会被编译器完全忽略。很多用户可能会在写project_name,但实际上这也是不允许的。原本的编译器没有对该情况报错,实际是个bug。
ODPS2.0将会对此种写法报错。有使用该写法用户将部分去掉即可。
例:
select src.a from src; 用户可能不小心写成了 select asdf.src.a from src; 之前能跑过,odps2.0会报错。

问题二:post.select.col.ref.with.table.alias

SELECT后处理字句中引用了SELECT列表中不存在列的问题。
在当前ODPS的某个版本,允许在order by, cluster by, distribute by, sort by中引用select列表中不存在的列,ODPS2.0与Hive兼容,不允许此种用法。需要script作者修改。

例1:
select value from src order by src.key; (错误)
改为
select src.key, value from src order by src.key; (正确)

例2:
select count() as cnt from src order by count(); (错误)
改为
select count(*) as cnt from src order by cnt; (正确)

例3:
select a.key as key, count() as cnt from src a order by a.key; (错误)
改为
select a.key as key, count(
) as cnt from src order by key; (正确)

问题三:repeated.groupby.key

GROUP BY key重复问题。
在ODPS lot模式中(set odps.sql.planner.mode=lot或者hybrid),允许GROUP BY中有重复的列,ODPS2.0此处与Hive兼容,不允许此语法。

例:
select count() from src group by key, value, key; (错误)
改为
select count(
) from src group by key, value; (正确)

问题四:string.join.double

在写JOIN条件的时候,有可能等号的左右两边分别是STRING类型和DOUBLE类型。
这种情况ODPS老版本两边都转成bigint,这会导致严重的精度损失问题,如 1.1 = “1” 在连接条件中会被认为是相等。新版本与Hive兼容转为double。
我们希望用户显式地去做类型转换,即
set odps.compiler.warning.disable=false;(该flag能够显示更多warning信息,未来会变成默认设置)
SELECT * FROM t1 JOIN t2 ON t1.double_value = t2.string_value; (不推荐)

WARNING:[1,48] implicit conversion from STRING to DOUBLE, potential data loss, use CAST function to suppress
改为
select * from t1 join t2 on t.double_value = cast(t2.string_value as double); (正确)
或用户期望的其他转换方式。

问题五:union.string.meet.non.string

UNION中隐式类型转换问题。
在ODPS某些模式中在union两侧对应列如果类型不同时会尝试隐式类型转换,其行为是一边为string,另一边为数字或DATETIME类型时,转为另一边的类型。然而绝大多数的数据库或者开源生态而言,使用的都不是这种转换规则,比如hive,mysql等会优先转成string。这种不确定的转换规则有时候会很危险,如用户从hive往odps迁移时,可能会导致无声无息的精度损失,语义错误等。
ODPS2.0为了安全禁止此隐式类型转换(这也是目前oracle的默认行为),如果需要请使用CAST函数。所以请Script作者检查自己脚本,明确要转到的类型,如果需要加入显式转换。

例:
select * from (select a_bigint c1 from t1 union all select a_string c1 from t2) x; (错误)

如果希望结果c1为bigint类型(这是目前ODPS的行为),改为
select * from (select a_bigint c1 from t1 union all select cast(a_string as bigint) c1 from t2) x; (正确)

如果希望结果c1为string类型(这是目前HIVE的行为),改为
select * from (select cast(a_bigint as string) c1 from t1 union all select a_string c1 from t2) x; (正确)

问题六:Null op null

计算的表达式两边都是NULL值,建议取消这种使用。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值