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

50pmv0ei  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(381)

我有多个文件,其中包含员工的姓名,id和技能集和另一个文件“skills.txt”,其中包含一些特定技能的列表。我正在尝试编写一个java mapreduce程序来找出拥有skills.txt中提到的技能的员工。
e、 g.假设有3个员工档案,如下所示:
emp1.txt文件-
姓名:汤姆
员工编号:001
技能:c++,java,sql
emp2.txt文件-
姓名:杰瑞
员工编号:002
技能:c++,php,sql
emp3.txt文件-
姓名:杰克
员工编号:002
技能:java、php
技能.txt-
PHP
sql语句
那么我的结果应该如下。
php-002;千斤顶-003
sql tom-001;杰瑞-002
所有这四个文件都在我的hdfs中。我对hadoop和mapreduce非常陌生。。我已经为此奋斗了很多,但没有得到任何适当的逻辑去做。我能够写程序,如果只有一个技能,我得到的技能需要搜索作为参数mapreduce程序。但我不能做的时候,有多个技能是要搜索和技能的文件格式与其他员工的档案。

wsxa1bj1

wsxa1bj11#

解决方案是将skills.txt文件添加到distributedcache中。在Map器中,使用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());

我希望这能让你上路。。

brccelvz

brccelvz2#

如果您的技能列表如此之短,您可以通过配置将其传递给Map器,在Map器中读回并将其与输入匹配。为什么只为两个条目创建一个单独的文件?嗯,这样会更方便。像这样:
在你的司机身上-

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

在Map绘制器中-

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

但是,如果列表非常大,最好使用dist.cache。

相关问题