hive distinct优化

hive针对count(distinct xxx)只产生一个reduce的优化。

0x00 造成的原因

由于使用了distinct,导致在map端的combine无法合并重复数据;对于这种count()全聚合操作时,即使设定了reduce task个数,set mapred.reduce.tasks=100;hive也只会启动一个reducer。这就造成了所有map端传来的数据都在一个tasks中执行,成为了性能瓶颈。

0x01 解决方式一(分治法)

该方法优势在于使用不同的reducer各自进行COUNT(DISTINCT)计算,充分发挥hadoop的优势,然后进行求和,间接达到了效果。需要注意的是多个tasks同时计算产生重复值的问题,所以分组需要使用到目标列的子串。

    SELECT 
        SUM(tmp_num) total
    FROM
        (select
            substr(uid,1,4) tag,
            count(distinct substr(uid,5)) tmp_total
        from
            xxtable
        group by
            substr(uid,1,4)
        )t1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

经过验证,该方法在5000万数据量的情况下,不优化需要5分钟,经过优化需要3分钟,还是有一定的提升的。

0x10 解决方式二(随机分组法)

核心是使用group by替代count(distinct)。

SELECT--3
    SUM(tc) 
FROM
    (select--2 
        count(*) tc,
        tag  
    from 
        (select--1
            cast(rand() * 100 as bigint) tag,
            user_id 
        from 
            xxtable
        group by  
            user_id
        )t1 
    group by 
        tag
    )t2;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1层使用随机数作为分组依据,同时使用group by保证去重
  • 2层统计各分组下的统计数。
  • 3层对分组结果求和。

经过验证,该方法在5000万数据量的情况下,不优化需要5分钟,经过优化需要2.5分钟,有进一步提升。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值