因此,从Hadoop教程网站(http://Hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapreducetutorial.html#source_code)上,我了解了如何使用map reduce方法实现单词计数,并且输出的单词都是出现频率的。
我想做的是只有输出是最高频率的字从输入文件我有。
我希望输出只是
Jim 4
Word count的当前输出是每个单词及其频率。有没有人编辑单词计数,使它只是打印最高频率的单词和它的频率?
有没有人对如何实现这一点有什么提示呢?
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
一种可能的方法是将减速器的数量设置为“1”。然后,让一个减速器记住频率最高的单词,并在清理中将其写入输出。像这样:
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private Text tmpWord = new Text("");
private int tmpFrequency = 0;
@Override
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
if(sum > tmpFrequency) {
tmpFrequency = sum;
tmpWord = key;
}
}
@Override
public void cleanup(Context context) {
// write the word with the highest frequency
context.write(tmpWord, new IntWritable(tmpFrequency));
}
}
我试图使用这里定义的基本字数。当IntSumReducer执行context.write时,是否可能将该context.write传递给第二个reducer或输出类,该reducer或输出类将IntSumReducer给出的最终列表减少/更改到单个最大频率? 我对Hadoop/MapReduce和Java中的jobs概念相当陌生,所以我不确定我需要如何修改默认的WordCount以使其符合要求。我
所以,我一直在跟踪这个网站上的Mapreduce python代码(http://www . Michael-noll . com/tutorials/writing-an-Hadoop-Mapreduce-program-in-python/),它从一个文本文件中返回字数(即单词及其在文本中出现的次数)。但是,我想知道如何返回出现次数最多的单词。映射器和缩减器如下- 所以,我知道我需要在减速器的
问题内容: 我正在设计一个简单的调谐器,所以我的目标是显示音符名称(A,B,F#)以及理论声音和实际输入之间的 距离( 以分为单位)。 我是音频和信号处理的新手,所以我做了一些研究,发现 了一个 叫做快速傅立叶变换 的东西 ,它可以分析字节并给我频率。另外,我发现了一些Java库,例如通用数学和JTransforms,所以我不会自己编写硬代码。 我相信就这样,因为每个范围的频率都可以以相同的气质直
我使用给定的示例文件(https://github.com/tomwhite/hadoop-book/blob/master/input/ncdc/sample.txt)测试了这段代码。然而,当我根据我的数据文件修改映射器代码时,还原器从0%到33%,然后又回到0%。有没有人能帮我解释一下为什么会发生这种情况,或者我应该如何修改代码。我的数据看起来像:
我正在学习一些MapReduce,但是我遇到了一些问题,情况是这样的:我有两个文件:“users”包含一个用户列表,其中包含一些用户数据(性别、年龄、国家等)...)文件看起来像这样: “歌曲”包含所有用户收听的歌曲的数据(用户ID,收听日期和时间,艺术家ID,艺术家姓名,歌曲ID,歌曲标题): 目标是在某些国家找到k首最受欢迎的歌曲。k和输入中提供的国家列表。 我决定为映射器使用Multiple