使用mapreduce的名为的员工的最大工资

j1dl9f46  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(340)

假设我在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 班级。当我把钥匙 EmpName 然后,它将显示独特员工的所有工资。

我的mapreduce代码

文件: test.csv ```
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 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

请让我知道如何得到这个输出。
yfwxisqw

yfwxisqw1#

您必须从Map器中传递值,比如{raj,8000 kiran,6000 john,9000},所以键是常量,在下面的代码中您可以检查它是如何实现的,

public class MyMap extends Mapper<LongWritable,Text,Text,Text>    
   {  
     public void map(LongWritable k,Text v, Mapper<LongWritable,Text,Text,Text>.Context 
     con)throws IOException, InterruptedException  
   {  
     String line = v.toString();  
     String[] w=line.split(","); 
     String name = w[1] ; 
    int sal=Integer.parseInt(w[3]);  
    String map_op = name+","+sal ; 
    con.write(new Text("ds"), new Text(map_op)); 
    //ds {raj,8000 kiran,6000 john,9000}

    }  
   }

经过洗牌和排序“//ds{raj,8000 kiran,6000 john,9000}”
这就是结果,这里我们把ds作为密钥传递,
现在让我们看看减速机方法

public class MyRed extends Reducer<Text,Text,IntWritable,Text>  
{  

      //ds {raj,8000 kiran,6000 john,9000}

 public void reduce(Text k, Iterable<Text> vlist, Reducer<Text,Text,IntWritable,Text>.Context con)
 throws IOException , InterruptedException  
    {  
     int max=0;  
     String name = k.toString() ;

     for(Text v: vlist)  
  {

         int salary = Integer.parseInt(v.toString().split(",")[1]) ;
         max=Math.max(max, salary); 

         if(salary == max)
        {
            name = v.toString().split(",")[0] ;
        }
  }  

  con.write(new IntWritable(max), new Text(name));  
 }
}

//9000约翰:-此o/p将由减速机生产

pgvzfuti

pgvzfuti2#

在你的 map 阶段保存薪资最高的条目,并在期间将其写入上下文 cleanup . 这导致每个Map器只有一个输出,这是那些Map器见过的薪水最高的条目。当您输出条目时,您可以只输出整个文本行。在你的单身 reduce 然后再次拆分文本行,并确定发送的文本行的最大工资-这并不是每个Map程序只发送一个项目那么多。
下面是一个java示例,用于根据声誉确定前10名用户。你应该能从中得到灵感。
顺便说一句:你要求的代码,但没有提到在哪种语言,也没有显示自己以前的任何尝试,因此我只是向你指出上述例子。

gtlvzcf8

gtlvzcf83#

请尝试以下代码。你会得到结果的。

public static class MyMap extends Mapper<LongWritable,Text,Text,Text>    
 {  
  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]);  
   string name=Integer.parseInt(w[1]);
   con.write(new Text(name), new Text(name+","+sal));  
   }  
 } 

 public static class MyRed extends Reducer<Text,Text,IntWritable,Text>  
 {  
  public void reduce(Text k, Iterable<Text> vlist, Context con)
  throws IOException , InterruptedException  
     {  
      int max=0;  
      for(Text v:vlist)  
   {
        String line = v.toString();  
        String[] w=line.split(",");  
        int sal=Integer.parseInt(w[1]); 
        max=Math.max(max, sal);
   }  
   con.write(new IntWritable(max), k);  
  }

 }

相关问题