gpt4 book ai didi

hadoop - 如何从 "sort"中出现频率最高的 30 个词降序排列?

转载 作者:可可西里 更新时间:2023-11-01 15:38:56 28 4
gpt4 key购买 nike

我的映射器 (Hadoop 1.2.1) 创建键值对标记,我从一个简单的文本文件中读取它们。没有火箭科学。 reducer 最终“捆绑”(在 Hadoop 中,您是否像在 SQL 中那样称呼该分组?)相同的键并对值 1 求和。这是默认的 Hadoop 教程。

但是,当我的 reducer 可以使用这些值时,我想对它们进行降序排序。仅显示前 30 个标记(字符串、单词)。

我好像有些概念不是很清楚。

  • 首先,为每个键值对调用 reduce 方法,对吗?因此,我看不到一个地方可以缓冲像 HashMap 这样的东西,它可以保存最高的结果(最频繁的标记)。
  • 我在想,如果我有这样一个变量,我可以很容易地比较和插入值在前 30 名内的每个键。处理这个频率排名任务的合适方法是什么?

    public static class Reduce extends MapReduceBase implements
    Reducer<Text, IntWritable, Text, IntWritable> {

    public void reduce(Text key, Iterator<IntWritable> values,
    OutputCollector<Text, IntWritable> output, Reporter reporter)
    throws IOException {

    int sum = 0;
    while (values.hasNext()) {
    sum += values.next().get();
    }
    // CURRENTLY I SIMPLY OUTPUT THE KEY AND THE SUM.
    // IN THIS PLACE, HOW COULD YOU STORE E.G. A HASHMAP THAT
    // COULD STORE THE TOP 30?
    output.collect(key, new IntWritable(sum));
    LOG.info("REDUCE: added to output:: key: " + key.toString());
    }

最佳答案

First, the reduce method is invoked for every key-value pair, right? Thus, I don't see a place to buffer something like a HashMap, which could hold the top results (most frequent tokens).

有点细微差别:reduce 方法针对每个键运行一次,而不是键值对。具有该键的每个值都显示在 Iterator 中。如果你想存储一个HashMap,你可以在setup函数中设置它(或者让它成为私有(private)对象),在reduce函数中与它交互,然后在 cleanup 函数中用它做任何事情。因此,绝对有可能在对 reduce 的调用中保持状态。

不过,我认为您或许能够以更聪明的方式解决您的问题。我已经多次写过关于前十名列表的文章,只是因为我发现它们很有趣并且它们是非常有用的工具。我希望前 30 名与前 10 名之间的关系显而易见。

  • Here is an example of a top-ten list generator我前一段时间写的可以适应你的问题。您可以稍微改变解决问题的方式以适应这种模式。在我的代码中,我使用 TreeMap 而不是 HashMap,因为 TreeMap 使事物按排序顺序排列。达到 31 项后,弹出频率最低的项。

  • 我在MapReduce Design patterns这本书中也讨论了前十名模式(抱歉无耻的外挂)。

  • blogged about top ten lists几个月前。

关于hadoop - 如何从 "sort"中出现频率最高的 30 个词降序排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20225091/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com