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

相關文章
相關標籤/搜索