首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带堆的MapReduce排序

带堆的MapReduce排序
EN

Stack Overflow用户
提问于 2018-03-20 08:18:46
回答 2查看 180关注 0票数 0

我试图分析包含followerfollowee对的社交网络数据。我想找到十大用户中使用MapReduce最多的用户

我用一步userIDnumber_of_followee做了一对MapReduce。

然而,对于这些数据,我不知道如何在分布式系统中对它们进行排序。

我不确定如何在Mappers和减速器中使用priority queue,因为它们具有分布式数据。

有人能解释一下我如何使用数据结构对海量数据进行排序吗?

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-20 14:47:02

如果您有user_id = number_of_followers格式的大输入文件(文件),那么查找顶级N用户的简单地图缩减算法是:

  1. 每个映射器处理自己的输入,并在其文件中找到顶级的N个用户,并将它们写入一个减速器
  2. 单减速器接收number_of_mappers * N行并在其中查找顶级N个用户
票数 1
EN

Stack Overflow用户

发布于 2018-03-20 18:31:49

要按降序排序数据,您需要另一个mapreduce作业。Mapper将发出“追随者数”作为键,twitter句柄作为值。

代码语言:javascript
复制
class SortingMap extends Map<LongWritable, Text, LongWritable, Text> {
    private Text value = new Text();
    private LongWritable key = new LongWritable(0);

    @Overwrite
    public void map(LongWritable key, Text value, Context context) throws IOException {
        String line = value.toString();
        // Assuming that the input data is "TweeterId <number of follower>" separated by tab
        String tokens[] = value.split(Pattern.quote("\t"));
        if(tokens.length > 1) {
            key.set(Long.parseLong(tokens[1]));
            value.set(tokens[0]);
            context.write(key, value);
        }
    }
}

对于还原剂,请使用IdentityReducer

代码语言:javascript
复制
// SortedComparator Class

public class DescendingOrderKeyComparator extends WritableComparator {
    @Override
    public int compare(WritableComparable w1, WritableComparable w2) {
        return -1 * w1.compareTo(w2);
    }
}

在驱动程序类中,设置SortedComparator

代码语言:javascript
复制
job.setSortComparatorClass(DescendingOrderKeyComparator.class);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49379279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档