2012-09-09 35 views
5

如何按降序排列减价产出? 我正在开发一个必须返回最高收听歌曲的应用程序。因此,歌曲必须按听的次数排序。 我的应用程序的工作过程是这样:MapReduce - 如何按价值降低产出

Input: [email protected]@boolean 
MapOutput : songname userid 
ReduceOutput : songname number_of_listening 

任何想法如何做到这一点?

+0

我发现这个链接信息就什么已经通过Hadoop的以尊重的态度来排序:https://pkghosh.wordpress.com/2011/04/13/map-reduce-secondary-sort- does-it-all/ –

回答

2

the docs,Reducer输出不重新排序。通过为JobConf.setOutputValueGroupingComparator(Class)设置适当的值,或者在单独的步骤中对减速器的最终输出进行排序,将输入分类到还原器(如果适用于您的应用程序)。

+0

感谢您的回答,减速机的排序输入值不能解决我的问题。有一种方法可以开始两个工作,第一个输出作为第二个输入? –

+0

@ highlycaffeinated是正确的。在配置映射器和简化器的MR类中,只需配置并提交指向第一个作业输出的第二个作业作为第二个作业的输入。一定要使用submitAndWait而不是仅仅提交。 –

+0

谢谢克里斯。我该怎么做?我必须从shell(一个接一个地)运行这两项工作,或者有两种方法可以同时启动? 我看到Job API [链接](http://hadoop.apache.org/common/docs/r1.0.3/api/index.html),并且没有方法可以进行预先输入。 对不起,这是我第一次与hadoop合作。 –

5

最好的方法是使用第一个MapReduce作业的输出作为另一个作业的输入,我称之为Sort.java。由于Hadoop Map函数具有排序算法,因此您甚至不需要reduce类。刚做这样的事情:

public static class Map extends Mapper<LongWritable,Text,IntWritable,Text>{ 
    private Text word = new Text(); 
    public void map(LongWritable key, Text value, Context context) throws IO Exception, Interrupted Exception{ 
    String line = value.toString(); 
    StringTokenizer tokenizer = new StringTokenizer(line); 
    word.set(tokenizer.nextToken()); 
    IntWritable number = new IntWritable(Integer.parseInt(tokenizer.nextToken())); 
    context.write(number,word); 
    }  
} 

将由LongWritable值你的[LongWritable,文字]你的第一个MapReduce的输出排序。让我知道它是如何工作的!

CL

+1

从Hadoop 2.4.0的Mapper类javadoc:“如果作业有零减少,那么Mapper的输出直接写入OutputFormat而不用按键排序。”这不意味着你的答案实际上是不正确的吗? –