假设我在HDFS中有一个包含以下数据的文件:

EmpId,EmpName,Dept,Salary

121,Raj,Dept1,8000
122,Kiran,Dept2,6000
123,John,Dept3,9000

使用MapReduce我只想获得最大Salary的员工的EmpNameSalary
我能够获取最大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名用户。您应该能够从中获得灵感。

顺便说一句:您要求提供代码,但没有提到使用哪种语言,也没有亲自展示过任何尝试,因此,我仅向您指出上述示例。

10-08 12:51