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之后,结果不会发生变化。

被折叠的 条评论
为什么被折叠?



