假设我在HDFS中有一个包含以下数据的文件:
EmpId,EmpName,Dept,Salary
121,Raj,Dept1,8000
122,Kiran,Dept2,6000
123,John,Dept3,9000
使用MapReduce我只想获得最大
Salary
的员工的EmpName
和Salary
我能够获取最大
Salary
,但无法获取相应的EmpName
。通过将空键保留在Salary
类中并将空键保留在map
类中,我只能获得最大Math.max()
。当我将密钥保留为reduce
时,它将显示唯一员工的所有薪水。我的Mapreduce代码
文件:
EmpName
121,Raj,Dept1,8000
122,Kiran,Dept2,6000
123,John,Dept3,9000
public static class MyMap extends Mapper<LongWritable,Text,Text,IntWritable>
{
public void map(LongWritable k,Text v, Context con)throws IOException, InterruptedException
{
String line = v.toString();
String[] w=line.split(",");
int sal=Integer.parseInt(w[3]);
con.write(new Text("Raj"), new IntWritable(sal));
}
}
public static class MyRed extends Reducer<Text,IntWritable,IntWritable,Text>
{
public void reduce(Text k, Iterable<IntWritable> vlist, Context con)
throws IOException , InterruptedException
{
int max=0;
for(IntWritable v:vlist)
{
max=Math.max(max, v.get());
}
con.write(new IntWritable(max), new Text());
}
输出:
9000
这里我需要的输出是:
9000 John
请让我知道如何获得此输出。
最佳答案
在map
阶段中,保存薪水最高的条目,并在cleanup
期间将其写入上下文。这样每个映射器仅产生一个输出,这是那些映射器看到的最高薪水的条目。当您输出条目时,您可以只输出整个文本行。然后在单个 reduce
阶段中,再次拆分文本行并确定最大值。发送的文本行的薪水-不如每个映射器仅发送单个项目的工资。
Here是Java中的一个示例,用于根据其声誉确定前10名用户。您应该能够从中获得灵感。
顺便说一句:您要求提供代码,但没有提到使用哪种语言,也没有亲自展示过任何尝试,因此,我仅向您指出上述示例。