假设我在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
请让我知道如何得到这个输出。
3条答案
按热度按时间yfwxisqw1#
您必须从Map器中传递值,比如{raj,8000 kiran,6000 john,9000},所以键是常量,在下面的代码中您可以检查它是如何实现的,
经过洗牌和排序“//ds{raj,8000 kiran,6000 john,9000}”
这就是结果,这里我们把ds作为密钥传递,
现在让我们看看减速机方法
//9000约翰:-此o/p将由减速机生产
pgvzfuti2#
在你的
map
阶段保存薪资最高的条目,并在期间将其写入上下文cleanup
. 这导致每个Map器只有一个输出,这是那些Map器见过的薪水最高的条目。当您输出条目时,您可以只输出整个文本行。在你的单身reduce
然后再次拆分文本行,并确定发送的文本行的最大工资-这并不是每个Map程序只发送一个项目那么多。下面是一个java示例,用于根据声誉确定前10名用户。你应该能从中得到灵感。
顺便说一句:你要求的代码,但没有提到在哪种语言,也没有显示自己以前的任何尝试,因此我只是向你指出上述例子。
gtlvzcf83#
请尝试以下代码。你会得到结果的。