zoukankan      html  css  js  c++  java
  • hive中groupby和distinct区别以及性能比较

    Hive去重统计

    先说核心:

    都会在map阶段count,但reduce阶段,distinct只有一个, group by 可以有多个进行并行聚合,所以group by会快。

    经常在公司还能看到。很多老人用distinct去重,很容易数据量大的时候的数据倾斜。感谢上次冲哥的指正。

    相信使用Hive的人平时会经常用到去重统计之类的吧,但是好像平时很少关注这个去重的性能问题,但是当一个表的数据量非常大的时候,会发现一个简单的count(distinct order_no)这种语句跑的特别慢,和直接运行count(order_no)的时间差了很多,于是研究了一下。
    先说结论:能使用group by代替distinc就不要使用distinct,例子:

    实际论证

    order_snap为订单的快照表 总记录条数763191489,即将近8亿条记录,总大小:108.877GB,存储的是公司所有的订单信息,表的字段大概有20个,其中订单号是没有重复的,所以在统计总共有多少订单号的时候去重不去重结果都一样,我们来看看:
    统计所有的订单有多少条条数,一个count函数就可以搞定的sql性能如何。

    • DISTINCT
    select count(distinct order_no) from order_snap;
    Stage-Stage-1: Map: 396 Reduce: 1 Cumulative CPU: 7915.67 sec HDFS Read: 119072894175 HDFS Write: 10 SUCCESS
    Total MapReduce CPU Time Spent: 0 days 2 hours 11 minutes 55 seconds 670 msec
    OK
    _c0
    763191489
    Time taken: 1818.864 seconds, Fetched: 1 row(s)
    • GROUP BY
    select count(t.order_no) from (select order_no from order_snap group by order_no) t;
    Stage-Stage-1: Map: 396 Reduce: 457 Cumulative CPU: 10056.7 sec HDFS Read: 119074266583 HDFS Write: 53469 SUCCESS
    Stage-Stage-2: Map: 177 Reduce: 1 Cumulative CPU: 280.22 sec HDFS Read: 472596 HDFS Write: 10 SUCCESS
    Total MapReduce CPU Time Spent: 0 days 2 hours 52 minutes 16 seconds 920 msec
    OK
    _c0
    763191489
    Time taken: 244.192 seconds, Fetched: 1 row(s)

    结论:第二种写法的性能是第一种的7.448499541
    注意到为什么会有这个差异,Hadoop其实就是处理大数据的,Hive并不怕数据有多大,怕的就是数据倾斜,我们看看两者的输出信息:

    # distinct
    Stage-Stage-1: Map: 396 Reduce: 1 Cumulative CPU: 7915.67 sec HDFS Read: 119072894175 HDFS Write: 10 SUCCESS
    # group by
    Stage-Stage-1: Map: 396 Reduce: 457 Cumulative CPU: 10056.7 sec HDFS Read: 119074266583 HDFS Write: 53469 SUCCESS

    使用distinct会将所有的order_no都shuffle到一个reducer里面,这就是我们所说的数据倾斜,都倾斜到一个reducer这样性能能不低么?

    再看第二个,直接按订单号分组,起了457个reducer,将数据分布到多台机器上执行,时间当然快。

    由于没有手动指定Reduce的个数,Hive会根据数据的大小动态的指定Reduce大小,但是可以手动指定

    hive> set mapred.reduce.tasks=100
  • 相关阅读:
    Git push 出错 [The remote end hung up unexpectedly]
    [Git高级教程(二)] 远程仓库版本回退方法
    git分支与版本管理、版本回退、冲突解决记录
    上传本地代码到gitHub过程详解
    如何用git将项目代码上传到github
    Git pull 强制覆盖本地文件
    Git忽略规则.gitignore梳理
    composer本地安装文档
    服务器通过微信公众号Token验证测试的代码(Python版)
    转载自lanceyan: 一致性hash和solr千万级数据分布式搜索引擎中的应用
  • 原文地址:https://www.cnblogs.com/wqbin/p/11050970.html
Copyright © 2011-2022 走看看