我有mapreduce的问题。作为输入提供歌曲列表(“Songname”#“UserID”#“boolean”)我必须有一个歌曲列表,其中指定不同用户听多少时间...所以''输出(“歌曲名称” ”, “timelistening”)。 我使用哈希表只允许一对夫妇。 使用短文件时效果很好但是当我输入一个大约1000000条记录的列表时,它会返回所有记录的相同值(20)。
这是我的映射器:
public static class CanzoniMapper extends Mapper<Object, Text, Text, IntWritable>{
private IntWritable userID = new IntWritable(0);
private Text song = new Text();
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String[] caratteri = value.toString().split("#");
if(caratteri[2].equals("1")){
song.set(caratteri[0]);
userID.set(Integer.parseInt(caratteri[1]));
context.write(song,userID);
}
}
}
这是我的减速机:
public static class CanzoniReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
Hashtable<IntWritable,Text> doppioni = new Hashtable<IntWritable,Text>();
for (IntWritable val : values) {
doppioni.put(val,key);
}
result.set(doppioni.size());
doppioni.clear();
context.write(key,result);
}
}
和主要:
Configuration conf = new Configuration();
Job job = new Job(conf, "word count");
job.setJarByClass(Canzoni.class);
job.setMapperClass(CanzoniMapper.class);
//job.setCombinerClass(CanzoniReducer.class);
//job.setNumReduceTasks(2);
job.setReducerClass(CanzoniReducer.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);
任何想法???
答案 0 :(得分:0)
也许我解决了。这是一个输入问题。与歌曲数量相比,记录太多,因此在这些记录列表中,每个用户至少列出一首歌曲。 在我的测试中,我有20个不同的用户,所以自然结果给了我20首歌曲。 我必须增加不同歌曲的数量。