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条
而利用MR引擎查询出来的结果是正确的7条
set hive.execution.engine=mr;
原因分析
这是因为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