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;

 

版权声明:本文为dahaha原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dahaha/p/11208298.html