• 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 

    参考https://blog.csdn.net/qq_37714755/article/details/105438009

  • 相关阅读:
    01Tensorflow学习之Tensorflow基本介绍
    C#四舍五入说明
    3类与对象——重拾Java
    1Java语言概述——重拾Java
    Android 字体效果
    Python相关资料收集
    2013.11.23思科研发中心面试
    【转】理解同步与异步
    OpenCV中的SURF算法介绍
    OpenCV中Kinect的使用(3)
  • 原文地址:https://www.cnblogs.com/yangxusun9/p/12675606.html
Copyright © 2020-2023  润新知