你好,游客 登录 注册 搜索
背景:
阅读新闻

hadoop 排重优化

[日期:2015-09-06] 来源:开源中国新闻  作者: [字体: ]

如果觉得有帮助的话就顶下吧

在统计的时候经常会用到排重,比如想统计每日登陆用户,但是一个用户一次多次登陆情况,或者一个产品被多少个用户下载。。等等情况

截图一是我之前写的代码:

下面是我优化后代码

public static class ReduceTask extends Reducer<Text, Text, Text, IntWritable> {
    private IntWritable rval = new IntWritable();
    private Multiset<Text> multiset=HashMultiset.create();
    @Override
    protected void reduce(Text key, Iterable<Text> values, Context context)
    throws IOException, InterruptedException {
multiset.clear();
for (Text item:values){
    multiset.add(item);
}
rval.set(multiset.elementSet().size());
context.write(key, rval);
    }
}

Multiset,会将相同的key,存到value种,只要将key遍历出来取值的个数就是排重后的数据。

前者是循环嵌套查找但是占用内存少 ,1179个组,平均每个组被分到6万条,最坏情况下(6w/2)^2*1179级别的循环,后者利用hashmap高效的存取值方式,是O(n)的级别,但是占用内存比较大

性能对比,下图是输入的数据,经过map的筛选,,

下图是代码1执行的用时

执行了一小时还没结束,下图是代码二的时间 只要俩分钟不到,执行速度有大幅提升





收藏 推荐 打印 | 录入:elainebo | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款