网站首页 > 技术文章 正文
作者:辉少
异常描述
- 测试环境
1.RedHat7.2
2.CM和CDH版本为5.16.2
在CDH5.16.2 中使用Hive时 ,当Hive 的查询where条件中使用Date函数后,函数中的列的值会在返回结果中被改变,导致结果不正确。具体表现为使用Date 函数当查询条件后导致string 格式的日期丢失了时间部分,只有日期。展示如下:
select * from testdate;
SELECT * from testdate where Date(str2) == '2020-05-24';
异常重现
重新创建表复现该问题
create table testdate2 (str1 string , str2 string ,str3 string, str4 string);
insert into table testdate2 values ("日期测试1",'2020-05-24 19:50:32','2020-05-24','testdate');
insert into table testdate2 values ("日期测试2",'2020-05-24 20:20:32','2020-05-25','testdate2');
分别使用带Date 函数条件、不带条件 、以及其他条件查看,确认的确存在该问题
SELECT * from testdate2 where Date(str2) == '2020-05-24';
select * from testdate2;
SELECT * from testdate2 where str3 == '2020-05-25';
异常分析
关于以上问题,与Hive的一个已知BUG HIVE-22513[1]有关,主要是由于Hive对列条件过滤操作中的持续传播从而导致错误的结果。Hive 自0.14.0开始,加入了一项CBO (Cost based Optimizer),来对HQL执行计划进行优化,这个功能通过”hive.cbo.enable”来开启。Hive 1.1.0 之后,该功能默认开启,而CDH5.16.2 中Hive 版本1.1.0,因此受影响。
异常解决和总结
对于Date函数持续传播从而导致错误的结果基于上述分析,提供以下2种解决办法
1.单个查询中临时关闭CBO,在Hive 1.1.0 可以通过set hive.optimize.constant.propagation = false; 来临时关闭单个查询,缺点是可能会影响query的性能。从参考文档[2][3]中可以看出,使用constant.propagation会在一定条件下在query进入执行阶段前预先计算部分值,所以对query影响具体是因query不同而不同的。
set hive.optimize.constant.propagation = false;
SELECT * from testdate2 where Date(str2) == '2020-05-24';
2.使用其他函数代替Date 函数,比如substr(str2,1,10) = '2020-05-24'
SELECT * from testdate2 where substr(str2,1,10) = '2020-05-24';
参考文档:
[1] https://issues.apache.org/jira/browse/HIVE-22513[2] https://en.wikipedia.org/wiki/Constant_folding#Constant_propagation[3] https://issues.apache.org/jira/browse/HIVE-5771
猜你喜欢
- 2024-10-12 大数据分析工具——hive入门 hive数据分析的一般流程是什么
- 2024-10-12 019Hive基本使用03 019Hive基本使用03 #liaoit
- 2024-10-12 手把手教你搭建Hive环境 搭建hive集群
- 2024-10-12 0474-如何使用SQL Developer访问Hive
- 2024-10-12 大数据之-HIVE入门(十四) php hive大数据处理
- 2024-10-12 Hive 迁移参考方案及测试(下) hive表迁移
- 2024-10-12 0263-Hive2.2.0如何与CDH集群中的Spark1.6集成
- 2024-10-12 如何在HUE上通过oozie调用Hive SQL工作流
- 2024-10-12 百度二面:你做过哪些Hive调优啊? hive调优与参数设置
- 2024-10-12 HiveSQL:如何从给定的日期中减去指定数量的天数?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)