项目场景:
在Hive中需要写一些判断结构体是否为null的语句
问题描述:
例如struct是一个结构体,它有一些字段比如user_id,page_id等等,在Hive3.x版本中,使用struct is not null
时没有把结构体为null的数据筛选掉。
原因分析:
这是Hive3.x中的一个bug,在语句的执行计划中,这个判断结构体是否为空的过滤条件直接被忽略了。
在数据库中,有RBO(基于规则的优化策略)和CBO(基于代价的优化策略)两种优化策略。实际上就是因为CBO这个优化策略导致的,Hive中默认使用了CBO优化策略。
解决方案:
1)方案一:已知了结构体struct里的字段名称,直接判断结构体里的字段是否为null即可
2)方案二:在Hive4.0版本中修复了此bug,因此使用Hive4.0版本即可,或者根据Hive4.0修复这部分的代码,在自己所用的Hive版本中修改对应的代码
3)方案三:在Hive中禁用CBO优化set hive.cbo.enable=false;
附:
Hive此Bug的网址:https://issues.apache.org/jira/browse/HIVE-21778