Hive开启hive.cbo.enable后丢数据

1、用户反馈在执行一个脚本时丢了一部分数据,问题的表现是,这个脚本运行的结果不包含index_code=BIZ_JTWL_AT_0079,BIZ_JTWL_AT_0080,BIZ_JTWL_AT_0081,BIZ_JTWL_AT_0082这4个指标。因为这个脚本是各个指标union起来的,所以他单摘出这几个指标的语句进行检查,是可以执行的,有结果的,就是放在脚本中union在一起就丢了。

2、根据用户反馈,查看用户脚本,将用户脚本中带有index_code=BIZ_JTWL_AT_0079,BIZ_JTWL_AT_0080,BIZ_JTWL_AT_0081,BIZ_JTWL_AT_0082的sql单独拿出来查看是否有数据

经查询后确实是有数据的。

3、进一步继续排查,如果查出来是有数据的就一定会插入,用户的表里没有这些数据说明用户的查询语句是根本没有查出来的,再次想法下用客户的查询语句进行查询该sql

果然是没有查出数据!

4、同样的sql语句我的查询是有结果的,而用户的是没有结果的,区别就在于两个查询使用的参数是不同的,进一步排查用户使用的参数

SET hive.cbo.enable = TRUE;

SET hive.exec.dynamic.partition = TRUE;

SET hive.exec.dynamic.partition.mode = nonstrict;

SET hive.stats.autogather = TRUE;

SET hive.execution.engine = spark;

SET hive.map.aggr = TRUE;

SET hive.auto.convert.join = TRUE;

5、在看到用户使用hive.cbo.enable时大概就知道问题应该出现在优化器上,于是就查看在开启hive.cbo.enable的执行该脚本的一个执行计划

根据用户的sql进行分析

 select ownflag from (
 SELECT 
        '控制运力' AS ownflag,
    FROM
        xxxxx.xxxxxxx
    WHERE
        prt_dt = '2023-12-27'
UNION ALL
 SELECT
        ownflag,
    FROM
        xxxxx.xxxxxxxx
    WHERE
        prt_dt = '2023-12-27'
) t
where t.ownflag ='控制运力' ;

以上为用户sql造成本次问题的部分逻辑,我经过简化处理的。

可以根据sql分析出该cbo优化,错误的将ownflag='控制运力'在第一次表扫描时过滤,而用户的逻辑是在第一扫描后将部分ownflag进行改造后再过滤。

针对次场景应该关闭hive.cbo.enable。并建议用户在使用该参数前应该先验证查询结果是否正确。这样可以确保在启用CBO之后,结果不会发生变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值