Hive 查询结果和insert结果不一致问题排查
1.起因
由于公司业务需要,在做近半年业务数据回补的时候,发现存在部分分区数据不符合业务需要,于是,很想当然的重跑脚本,结果发现该部分数据无法正确过滤;
2.问题描述
在对某张表进行操作的时候,发现where条件后面的 xx is not null 条件不能生效,即 我采用 select的方式能够得到正确的结果,但是,insert时产生的结果却不一致。
3.解决过程
在发现该问题后,首先觉得是is not null 的用法没有生效,于是,先将sql用查询的方式打印结果,发现是正确的,并且用insert到临时表的方式实验,发现结果也是正确的,那么奇怪了,同样的sql, query的方式结果正确,临时表结果也正确,只是在线上的脚本中失败?
于是怀疑是union all的问题(业务需要,多个查询结果union all 到一个事件表中),在尝试各种方式后,发现union all也是正确的,最后尝试删除这张表重跑试试,结果居然成功了。
4.结论
原来,insert overwrite 在插入分区表的已有分区的表时,如果待插入的查询结果为空,那么insert overwrite不会生效,即 它会保留旧有结果,然后给你造成你的sql 的哪个地方没有生效的假象。。。。
这个问题暴露了我对hive 甚至 sql的基础掌握的情况还不够的事实,主要是踩得坑还不够多,还是要多锻炼呀。。。果然能力是练出来的。