hive 1.2.1的常量大坑bug
2016-07-07 17:48
176 查看
同事发现在hive 1.2.1和hive 0.13版本里面赋值常量,同样的SQL,得到结果是不同的,
SQL如下:
insert overwrite table test
select month_id,
client_version,
mac_id,
202030106 as kpi_id,
kpi_value,
create_date
from table1
where month_id = 201604 and kpi_id=202030105 and client_version in ('aa','bb');
结果如下:
hive 1.2.1版本 得到test的字段kpi_id=202030105 ,而不是202030106??????,大坑,mysql使用习惯的大坑。
hive 0.13版本 得到test的字段kpi_id=202030106,是正确的
采用explain进行分析计划对比:
在hive 1.2.1版本,map阶段,没有取常量202030106 ,因为给的别名刚好也是kpi_id,跟表字段一样,在where条件里面,又有kpi_id=202030105 ,可能处于优化考虑,减少map获取数据,减少IO,没有从表取这个字段(常量),到reduce阶段,结果把where条件kpi_id=202030105插入到目标,神马情况!!!!!
由于kpi_id是bigint类型,cast(202030106 as bigint)这样写就没问题,或者把别名写得跟表字段名字不同,如as kpi_id11111;
另外一个大坑是,如SQL采用limit的限制,即使语句是cast(202030106 as bigint)的结果也是错误的,直接202030105插入到目标,解决还是别名的问题,不要跟表字段一样
SQL如下:
insert overwrite table test
select month_id,
client_version,
mac_id,
202030106 as kpi_id,
kpi_value,
create_date
from table1
where month_id = 201604 and kpi_id=202030105 and client_version in ('aa','bb');
结果如下:
hive 1.2.1版本 得到test的字段kpi_id=202030105 ,而不是202030106??????,大坑,mysql使用习惯的大坑。
hive 0.13版本 得到test的字段kpi_id=202030106,是正确的
采用explain进行分析计划对比:
在hive 1.2.1版本,map阶段,没有取常量202030106 ,因为给的别名刚好也是kpi_id,跟表字段一样,在where条件里面,又有kpi_id=202030105 ,可能处于优化考虑,减少map获取数据,减少IO,没有从表取这个字段(常量),到reduce阶段,结果把where条件kpi_id=202030105插入到目标,神马情况!!!!!
由于kpi_id是bigint类型,cast(202030106 as bigint)这样写就没问题,或者把别名写得跟表字段名字不同,如as kpi_id11111;
另外一个大坑是,如SQL采用limit的限制,即使语句是cast(202030106 as bigint)的结果也是错误的,直接202030105插入到目标,解决还是别名的问题,不要跟表字段一样
相关文章推荐
- Impala中最大连接数的设置
- 非常好的Oracle教程【转】
- Scalaz(46)- scalaz-stream 基础介绍
- java随机生成指定的位数
- 判断用户是供应商还是采购员
- java 反射 Class
- 关于Android栈的一些操作
- 财智,商业
- U盘安装xenserver简介
- centos7.2安装cobbler 并安装系统
- Eclipse导出JavaDoc文档提示"编码 GBK 的不可映射字符"
- 多表连接更新操作
- jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
- input框只能输入非负数
- 递归与分形图案
- Linux 2.4.0 中select()的主要代码片断——The C10M Problem
- 服务器压力测试心得
- lucene5.5 field
- mysql事务管理
- 有关Android中layout_weight的深处挖掘