hadoop 排重优化

若是以为有帮助的话就顶下吧java

在统计的时候常常会用到排重,好比想统计每日登录用户,可是一个用户一次屡次登录状况,或者一个产品被多少个用户下载。。等等状况ide

截图一是我以前写的代码:性能

下面是我优化后代码优化

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遍历出来取值的个数就是排重后的数据。code

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

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

下图是代码1执行的用时产品

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

相关文章
相关标签/搜索