Hive Bug系列之关联结果不正确详解

本文深入探讨了在Hive 1.2.1版本中遇到的一个关联查询结果不正确的问题。通过场景复现、原因追踪,揭示了在逻辑执行计划优化过程中,由于IdentityProjectRemover优化器移除了SelectOperator导致数据错位。解决方案包括修改SQL、关闭特定优化器、升级Hive版本或打补丁。对于Hive使用者,理解此类问题有助于写出更可靠的查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入

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作案的整个过程。

2.1脑补一下hive sql基本编译流程

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小萝卜算子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值