Hive on Tez 出现的bug 及原因解析

现象描述

在使用Tez引擎查询时,发现一个bug:

SELECT
         t1.*,t2.activity_id,t3.timeMap
     from
         (select * from ods_order_info where dt=‘2020-03-29‘) t1  --单独查询结果为7条
             left join
         (select order_id,activity_id  from ods_activity_order where dt=‘2020-03-29‘) t2  --t1 与t2 left join ,结果为7条
         on t1.id=t2.order_id
             join
         (select order_id,str_to_map(concat_ws(‘,‘,collect_set(concat(order_status,‘=‘,operate_time))),‘,‘,‘=‘) timeMap
          from ods_order_status_log where dt=‘2020-03-29‘
          group by order_id) t3  --单独查询是跟t1主键相同的7条
         on t3.order_id=t1.id

讲道理此SQL查询出的结果应该是7条,但是结果确是4条  

  Hive on Tez   出现的bug 及原因解析

 而利用MR引擎查询出来的结果是正确的7条

set hive.execution.engine=mr;

Hive on Tez   出现的bug 及原因解析

 原因分析

这是因为Tez和MR一样,都默认开启了mapjoin,这里面涉及到了几个参数

-- 是否自动开启mapjoin,默认为true
set hive.auto.convert.join=true;

-- mapjoin小表和大表的阈值设置
set hive.mapjoin.smalltable.filesize=25000000;

-- 多个mapjoin 转换为1个时,限制输入的最大的数据量 影响tez,默认10m
set hive.auto.convert.join.noconditionaltask.size =10000000;

当表的数据大于10m时,tez会把多余的那部分数据截掉,这样就会造成丢数据

解决方法

1.

hive.mapjoin.smalltable.filesize和hive.mapjoin.smalltable.filesize一致或者更大,一般扩大10倍是不会有问题的 保证小表中所有的数据,都可以参与计算。

2.

关闭map join