我想搜索文件中的特定单词并显示其计数。当要搜索的单词是单个单词时,我可以通过在驱动程序中设置配置来完成,如下所示:
驱动程序类:
Configuration conf = new Configuration();
conf.set("wordtosearch", "fun");
Mapper类:
public static class SearchMapper extends
Mapper<LongWritable, Text, Text, IntWritable> {
// Map code goes here.
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map (LongWritable Key, Text value,Context context )throws IOException,InterruptedException{
Configuration conf = context.getConfiguration();
//retrieve the wordToSearch variable
String wordToSearch = conf.get("wordtosearch");
String txt= value.toString();
if(txt.compareTo(wordToSearch)==0){
word = context.getCurrentValue();
context.getCurrentKey();
word.set(txt);
context.write(word, one);
}
但是当文件中有单词列表时,我不知道如何传递它。有些帖子指的是使用分布式缓存,但在这样做时我得到了#34;分布式缓存已被弃用&#34;错误。新api中是否有类似的方法来传递文件?
答案 0 :(得分:0)
你可以试试这个:判断参数是否是一个文件,然后根据参数的类型分别执行操作
答案 1 :(得分:0)
如果单词列表的大小合理,您仍然可以将其传递给配置:
答案 2 :(得分:0)
是的,新API中还有一种方法。
首先,将文件存储在HDFS中。然后,在Driver类(在main方法中)中,执行以下操作:
Configuration conf = getConf();
...
Job job = Job.getInstance(conf); ...
job.addCacheFile(new Path(filename).toUri());
最后,在mapper类中(例如在setup()
方法中),执行以下操作:
URI[] localPaths = context.getCacheFiles();
如果您有一个文件,则应将其存储在localPaths[0]
中。