2

我有多个文件,其中包含员工的姓名、ID 和技能集,另一个文件“skills.txt”包含一些特定技能的列表。我正在尝试编写一个 java mapreduce 程序来找出具有 Skill.txt 中提到的技能的员工。

例如,假设有 3 个员工文件如下:
emp1.txt-
姓名:Tom
EmpId:001
技能:C++、Java、SQL

emp2. ​​txt-
姓名:Jerry
EmpId:002
技能:C++、PHP、SQL

emp3.txt-
姓名:Jack
EmpId:002
技能:Java、PHP

Skills.txt-
PHP
SQL

那么我的结果应该如下。
PHP 杰瑞-002 ; 杰克-003
SQL 汤姆-001;杰瑞-002

所有这四个文件都在我的 HDFS 中。我对 hadoop 和 mapreduce 很陌生。我已经为此付出了很多努力,但没有得到任何适当的逻辑来做到这一点。我能够编写程序,如果只有一项技能并且我获得了搜索所需的技能作为 mapreduce 程序的参数。但是当要搜索多种技能并且技能与其他员工文件一起以文件格式存在时,我无法执行此操作。

4

2 回答 2

1

解决方案是将技能.txt 文件添加到您的 DistributedCache。在您的映射器中,您使用 setup() 函数读取文件,然后:

Path[] uris = DistributedCache.getLocalCacheFiles(context.getConfiguration());
String skillsfile = uris[0].toString(); 
BufferedReader in = new BufferedReader(new FileReader(patternsFile));

在作业设置期间,您必须将文件添加到分布式缓存:

DistributedCache.addCacheFile(new URI(skillsFile), job.getConfiguration());

我希望这会让你上路..

于 2013-09-05T12:29:38.233 回答
0

如果你的技能列表这么短,你可以通过Configuration将它传递给你的映射器,在你的映射器中读回它并与输入匹配。为什么要为 2 个条目创建一个单独的文件?恕我直言,这会更方便。像这样的东西:

在您的驱动程序中 -

Configuration conf = new Configuration();
conf.set("skillList", "PHP,MYSQL");
Job job = new Job(conf);

在你的映射器中 -

Configuration conf = context.getConfiguration();
String skillList = conf.get("skillList");
//Split skillList and do the rest

但是,如果列表真的很大,最好使用 Dist。缓存。

于 2013-09-05T20:44:55.773 回答