为了兼容spark,并使用hive的kerberos和hiveserver2功能和一些窗口函数,线上的hive由0.10升级至0.11,遇到几个问题,简单记录下:
1.分区schemal的问题
具体见:

2.部分函数运行
unix_timestamp

在参数为null时会报错:

hive> select unix_timestamp(null) from default.dual limit 5;
FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments
'TOK_NULL': The function UNIX_TIMESTAMP takes only string or timestamp types
变通的方法时通过case when做处理:
(case when ddtime is null then null else unix_timestamp(ddtime) end)
3. map join
关于map join的理解:
hive0.11默认的convert map join是开启的,在大部分的情况下会减少job的运行时间,不过有一些bug
1)null pointer的bug
报错信息:
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException:
java.lang.NullPointerException
2)字段hash值一样时出现的乱序问题
报错:
java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException
: Hive Runtime Error while processing row [Error getting row data with
exception java.lang.ArrayIndexOutOfBoundsException: xxxx
bugid:
https://issues.apache.org/jira/browse/HIVE-5256
https://issues.apache.org/jira/browse/HIVE-5056

一种解决方法时 set hive.auto.convert.join=false;这种方法在数据存在倾斜时(reduce阶段长时间处在99%)会有性能的问题。
不过官方有对应的patch,打上就可以fix.

4.double精度问题
hive double做运算,计算结果不精确,这其实是旧版本的hive的一个bug
bugid:
https://issues.apache.org/jira/browse/HIVE-2693

在hive0.11引入了decimal的类型,如果是double的类型可以通过cast(xxx as decimal)来解决

select cast(2.3333 as decimal)+cast(12.55 as decimal) from dual;


以后遇到问题再来补充。