hive 1.2.1的常量大坑bug

时间:2022-09-09 14:45:08

同事发现在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的常量大坑bug

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