同事发现在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插入到目标,解决还是别名的问题,不要跟表字段一样