Hadoop 如何";排序“;从最常用的30个词开始下降?
我的映射器(Hadoop 1.2.1)创建令牌的键值对,我从一个简单的文本文件中读取。没有火箭科学。最后,reducer“bundle”(在Hadoop中,您是否像在SQL中那样调用该分组?)使用相同的键,并对值1求和。这是默认的Hadoop教程 但是,当这些值对我的reducer可用时,我想对它们进行降序排序。仅显示前30个标记(字符串、单词) 似乎有些概念我不太清楚Hadoop 如何";排序“;从最常用的30个词开始下降?,hadoop,Hadoop,我的映射器(Hadoop 1.2.1)创建令牌的键值对,我从一个简单的文本文件中读取。没有火箭科学。最后,reducer“bundle”(在Hadoop中,您是否像在SQL中那样调用该分组?)使用相同的键,并对值1求和。这是默认的Hadoop教程 但是,当这些值对我的reducer可用时,我想对它们进行降序排序。仅显示前30个标记(字符串、单词) 似乎有些概念我不太清楚 首先,对每个键值对调用reduce方法,对吗?因此,我看不到一个地方可以缓冲像HashMap这样的东西,它可以保存顶级结果(
- 首先,对每个键值对调用
方法,对吗?因此,我看不到一个地方可以缓冲像HashMap这样的东西,它可以保存顶级结果(最常见的标记)李>reduce
- 我在想,如果我有这样一个变量,我可以很容易地比较和插入每一个值在前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()); }
}公共静态类Reduce扩展了MapReduceBase实现 减速器{ public void reduce(文本键、迭代器值、, OutputCollector输出,报告器(报告器) 抛出IOException{ 整数和=0; while(values.hasNext()){ sum+=values.next().get(); } //目前,我只输出键和和。 //在这个地方,您如何存储例如 //能储存前30名吗? collect(key,newintwriteable(sum)); LOG.info(“REDUCE:添加到输出::key:+key.toString()); }
reduce
方法对每个键运行一次,而不是键值对。带有该键的每个值都显示在迭代器中。如果要存储哈希映射
,可以在设置
函数中进行设置(或将其设置为私有对象),在reduce函数中与其交互,然后在清理
函数中对其执行任何操作。因此,在对reduce
的调用中保持状态是完全可能的
不过,我认为你也许可以用更聪明的方式解决你的问题。我已经写了很多次关于前十名的列表,只是因为我觉得它们很有趣,而且它们是非常有用的工具。我希望前30名与前10名之间的关系显而易见
- 我不久前写过一篇文章,可以适应你的问题。
你可以稍微改变一下你解决问题的方式来适应这种模式。在我的代码中,我使用
TreeMap
而不是HashMap
,因为TreeMap
将事物按顺序排列。一旦你有31个项目,弹出频率最低的一个
- 我还讨论了《MapReduce设计模式》一书中的前十种模式(很抱歉使用无耻的插件)
- 我几个月前就知道了
首先,对每个键值对调用reduce方法,对吗?
因此,我看不到一个可以缓冲HashMap之类的东西的地方,这
可以保存最重要的结果(最常见的标记)
有点细微差别:reduce
方法对每个键运行一次,而不是键值对。带有该键的每个值都显示在迭代器中。如果要存储哈希映射
,可以在设置
函数中进行设置(或将其设置为私有对象),在reduce函数中与其交互,然后在清理
函数中对其执行任何操作。因此,在对reduce
的调用中保持状态是完全可能的
不过,我认为你也许可以用更聪明的方式解决你的问题。我已经写了很多次关于前十名的列表,只是因为我觉得它们很有趣,而且它们是非常有用的工具。我希望前30名与前10名之间的关系显而易见
- 我不久前写过一篇文章,可以适应你的问题。
你可以稍微改变一下你解决问题的方式来适应这种模式。在我的代码中,我使用
TreeMap
而不是HashMap
,因为TreeMap
将事物按顺序排列。一旦你有31个项目,弹出频率最低的一个
- 我还讨论了《MapReduce设计模式》一书中的前十种模式(很抱歉使用无耻的插件)
- 我几个月前就知道了
这是一个坚实的开端!树形图有意义!谢谢你,唐纳德。绝对公平地指导书籍和文学(即使它是你的)。Hadoop 1.2.1中的cleanup
方法等效于什么?从中扩展mapper和reducer类的MapReduceBase类不是该方法的宿主。只有配置
和关闭
@feder啊!可耻!我不知道你正在使用旧的API。请注意,您的导入内容是.mapred.
而不是.mapreduce.
。。。我认为它没有类似的方法。也许你应该考虑转换。对不起:\我刚买了你的书:)这确实照亮了一些黑暗点。这是一个坚实的开始!树形图有意义!谢谢你,唐纳德。绝对公平地指导书籍和文学(即使它是你的)。Hadoop 1.2.1中的cleanup
方法等效于什么?从中扩展mapper和reducer类的MapReduceBase类不是该方法的宿主。只有配置
和关闭
@feder啊!可耻!我不知道你正在使用旧的API。请注意,您的导入内容是.mapred.
而不是.mapreduce.
。。。我认为它没有类似的方法。也许你应该考虑转换。对不起:\我刚买了你的书:)这确实照亮了一些黑暗点。