0

我对 M/R 程序非常陌生..我在 HDFS 中有一个文件,其中包含这种结构中的数据

EmpId,EmpName,部门,薪水,

1231,用户名1,部门1,5000
1232,用户名2,部门2,6000
1233,用户名3,部门3,7000

.
…………………………………………………………………………………………………………

现在我想找到薪水最高的员工的名字

我写了一个 map reduce 来找到最高薪水。在我的映射器类中,我发出了这样的输出

output.collect("最大值",员工工资);

在减速器中,我找到了键“最大值”的最大值。现在我想在映射器中使用这个值并找到获得最高薪水的员工的姓名。如何将减速器输出发送到映射器作为输入?这是完成我的任务的好方法吗?还有其他建议吗?

4

2 回答 2

1

我会让地图发出最高工资的完整元组。为此,创建一个实现Writable接口(http://hadoop.apache.org/docs/r1.2.0/api/org/apache/hadoop/io/Writable.html )的类(用于值)。也许TupleWritable适合您的需求(不是很复杂)。

由于每张地图都会发出 1 个值,因此网络不是问题,并且似乎可以在 reducer 中接收所有元组数据。您的减速器只需从“最大值”值中过滤掉顶部。

对于更复杂的问题,您将不得不考虑链接作业(http://developer.yahoo.com/hadoop/tutorial/module4.html#chaining

于 2013-08-16T08:05:38.830 回答
1

我可以建议以下解决方案

1. Find the max salary using your mapreduce job

2. Read the max salary from hdfs (it should be in the file in output folder of your job)

3. Save the max salary two configuration, say `configuration.set("max.salary", maxSalary);`

4. Create new mapper-only job. The mapper of this job should read maxSalary value from the configuration in the setup method and filter out employers with salary equal to the maxSalary in map method. Pass your data to this job.

结果,您将

PS 但是作为更好的方法,我建议您使用HIVEPIG来完成此类任务,因为如果它们不涉及复杂的数学/业务逻辑,那么在 hive 和 pig 等高级工具中实现它们会容易得多(和其他一些)。

于 2013-08-16T08:35:58.940 回答