目录
引入
Hive是互联数据仓库中使用最频繁的工具,做为仓库的技术人员,有很大必要去深入了解它,并以认真的态度去对待工作中遇到的每个问题,每个知识点,由点及面,让我们的技术更扎实,也让我们更有底气~~
Hive版本:hive-1.2.1
该bug对应的jira:
https://issues.apache.org/jira/browse/HIVE-10996
具体原因:hive-1.2.1 逻辑执行计划优化过程中优化掉了一个SelectOperator操作符,导致数据错位
在一次为业务方取数的时候,发现查出的数据与自己想象中的不一致,经过各种检查发现sql的逻辑并没有问题,查看执行计划,也没发现明显的问题。以自己对数据的了解,再加上对数据反复的考究,发现用这样的一个正确的sql,出的结果确实是不正确的……
当时业务紧急,改用了其它方式出数,后来,同事也遇到同样的问题,细细思考,打算一探究竟
1、场景复现
当时取数的逻辑过于复杂,我们用一些简单的测试数据来复现问题
1.1、测试数据准备
测试数据准备
为了更清晰的看明白结果,我们建立的tmp_test_a和tmp_test_b这两张表的数据是完全一样的,并且都只有一条数据
1.2、测试sql
所以期待的结果:
然而hive给我们的结果:
为毛?Why?这是个很简单的关联,我们很明显能看到结果不正确。但如果在一个非常复杂的并且我们又对数据不是很了解的业务环境下,又写了一个非常复杂的sql,正好用到了类似这样的逻辑,出的数据岂不是误导了大家?
2、追踪原因
这一块想要完全理解弄明白,必须要对hive的编译模块以及hive的serde模块有了解。经过一段时间的研究,我对hive的编译过程有了一些自己的见解,在探索的过程中也写了挺多的案例来验证里面的每一步过程,后面会坚持写hive编译模块及serde模块系列的文章,把自己学习到的东西分享出来。但这次文章中只会详细描述该bug作案的整个过程。