Hive ORC格式表两子查询单独有结果LEFT JOIN返回0行问题排查
问题原因分析
- 核心诱因是ORC存储格式的谓词下推(PPD)优化bug
你使用的是同表自关联场景,两个子查询分别携带了yeartype=1和yeartype=2的过滤条件。Hive处理ORC表时会错误地将两个子查询的过滤条件合并后下推到表扫描层,最终生效的过滤条件变成了yeartype=1 AND yeartype=2,该恒假条件导致扫描直接返回0条数据,关联结果自然为空。 - 单独执行子查询正常的原因
单条子查询执行时,只会下推当前子查询的单个过滤条件,不存在条件冲突,因此可以正常拿到结果。 - 改为Textfile格式后恢复正常的原因
Textfile格式默认不支持该类跨子查询的谓词合并下推逻辑,两个子查询的过滤条件会各自独立生效,分别拿到符合条件的结果后再做关联,就会返回预期数据。
验证及规避方案
- 验证方式:执行关联查询前先执行
set hive.optimize.ppd=false;关闭谓词下推,再运行原SQL,如果能返回正确结果即可确认是该问题导致。 - 规避方案:
- 临时查询场景可直接关闭当前会话的ORC谓词下推
- 升级Hive到2.3及以上稳定版本,该类谓词下推合并bug已经在后续版本得到修复
- 子查询中添加大值limit(如
limit 999999999)破坏谓词下推触发条件,也可避免该问题
内容的提问来源于stack exchange,提问作者Autumn
相关产品推荐
相关产品推荐

