我有多个文件,其中包含员工的姓名,ID和技能集,另一个文件"skills.txt"包含某些特定技能的列表。我正在尝试编写一个java mapreduce程序,以找出具有技能.txt中提到的技能的员工。
例如,假设有 3 个员工档案,如下所示:
emp1.txt-
姓名:Tom
EmpId:001
技能:C++、Java、SQL
emp2.txt-
姓名:Jerry
EmpId:002
技能:C++、PHP、SQL
emp3.txt-
姓名:杰克
EmpId:002
技能:Java,PHP
技能.txt-
PHP
SQL
那么我的结果应该如下。
PHP 杰里-002 ;杰克-003
SQL 汤姆-001 ;杰瑞-002
所有这四个文件都在我的HDFS中。我对Hadoop和mapreduce很陌生。我已经为此挣扎了很多,但没有得到任何适当的逻辑来做到这一点。如果只有一项技能,我能够编写程序,并且我获得了搜索所需的技能作为mapreduce程序的参数。但是,当要搜索多种技能并且这些技能与其他员工文件一起以文件格式存在时,我无法做到这一点。
解决方案是将技能.txt文件添加到分布式缓存中。在映射器中,您可以使用 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());
我希望这会让你上路。
如果您的技能列表如此之短,您可以通过配置将其传递给映射器,在映射器中读回它并将其与输入匹配。为什么要为仅 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.Cache。