Hive版本升级后,语法要求越来越严格,所以很多在1.1.0可以跑成功的SQL,到了2.3.5会报错。
1、隐式转换在HIVE2.2.0版本的之前,Hive尝试跨Hive类型组执行隐式转换。HIVE2.2.0之后将仅在每个类型组中执行隐式转换,包括字符串组,数值组或日期组,而不是跨组。为了组合来自不同组的类型(例如字符串类型和数值类型),在查询中需要从字符串到数值或从数值到字符串的显式强制转换。
例如: union语法中要求union的两张表对应字段类型一致。当对应字段类型在同一类型组会自动执行隐式转换,在不同类型组时需显示强制转换,不然语法报错。
执行下面语句报错
select 1 as c2, 2 as c2
union all
select 1.0 as c1, "2" as c1;
修改为如下语句后正常
select 1 as c2, 2 as c2
union all
select 1.0 as c1, cast("2" as int) as c1;
2、保留字
Hive随着版本变迁,保留字越来越多。Hive2.3.5预留更多保留字,如果SQL用到会产生语法问题。需要将与关键字冲突的属性名用反引号包围兼容。
例:select '1900-01-01' as date;
改为
select '1900-01-01' as `date`;
3、hive参数
hive.开头的参数如果不在Hive2.1预定义配置中(可能已经被移除,例如hive.security.authorization.enabled),或者大小写不对,set语句会直接报错 set hive.auto.convert.JOIN=true,大小写不对,执行会报错。
4、建表
建表时候不指定列的具体类型,在2.1之后会直接报错。
例如:create table test_table_null_no_type as select null as id, "zhangsan" as name;