使用mapreduce如何在HDFS中存在的所有其他文件中搜索特定文件的单词

时间:2013-09-05 12:09:54

标签: java hadoop mapreduce

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

E.g。假设有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 Jerry-002;杰克-003
SQL Tom-001;杰里-002

所有这四个文件都在我的HDFS中。 我是hadoop和mapreduce的新手。我已经为此做了很多努力,但没有得到任何合适的逻辑。我能够编写程序,如果只有一种技能,我会获得搜索mapreduce程序参数所需的技能。但是,当有多种技能被搜索并且技能与其他员工文件一起存在时,我无法做到。

2 个答案:

答案 0 :(得分:1)

解决方案是将skills.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());

我希望这会让你顺利上路..

答案 1 :(得分:0)

如果您的技能列表很短,您可以通过配置将其传递给您的映射器,在映射器中将其读回并与输入匹配。为什么只为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。高速缓存中。