当前位置: 首页 > 知识库问答 >
问题:

如何使用hadoop mapduce编程计算文件中特定单词的出现?

何宏博
2023-03-14

我试图使用java中的hadoop mapreduce编程计算文件中出现的<b>特定(输入、输出、单词)。但我无法找到一种方法将单词传递给map函数。我尝试了以下方法,但没有成功:-在mapper类中创建了一个静态字符串变量,并将第三个参数(即要搜索的单词)的值分配给它。然后尝试在map函数中使用这个静态变量。但在map函数中,静态变量值为空。我无法在map函数中获得第三个arment的值。

有办法通过JobConf对象设置值吗?请帮帮忙。我在下面粘贴了我的代码。

public class MyWordCount {

    public static class MyWordCountMap extends Mapper < Text, Text, Text, LongWritable > {
        static String wordToSearch;
        private final static LongWritable ONE = new LongWritable(1L);
        private Text word = new Text();
        public void map(Text key, Text value, Context context)
        throws IOException, InterruptedException {
            System.out.println(wordToSearch); // Here the value is coming as Null
            if (value.toString().compareTo(wordToSearch) == 0) {
                context.write(word, ONE);
            }
        }
    }


    public static class SumReduce extends Reducer < Text, LongWritable, Text, LongWritable > {

        public void reduce(Text key, Iterator < LongWritable > values,
            Context context) throws IOException, InterruptedException {
            long sum = 0L;
            while (values.hasNext()) {
                sum += values.next().get();
            }
            context.write(key, new LongWritable(sum));
        }
    }

    public static void main(String[] rawArgs) throws Exception {

        GenericOptionsParser parser = new GenericOptionsParser(rawArgs);
        Configuration conf = parser.getConfiguration();
        String[] args = parser.getRemainingArgs();
        Job job = new Job(conf, "wordcount");
        job.setJarByClass(MyWordCountMap.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        job.setMapperClass(MyWordCountMap.class);
        job.setReducerClass(SumReduce.class);
        job.setInputFormatClass(SequenceFileInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        String MyWord = args[2];
        MyWordCountMap.wordToSearch = MyWord;
        job.waitForCompletion(true);
    }

}

共有1个答案

左丘昊天
2023-03-14

有一种方法可以使用Configuration(参见此处的api)来做到这一点。例如,可以使用以下代码将“Tree”设置为要搜索的单词:

//Create a new configuration
Configuration conf = new Configuration();
//Set the work to be searched
conf.set("wordToSearch", "Tree");
//create the job
Job job = new Job(conf);

然后,在映射器/化简器类中,您可以使用以下内容获取 wordToSearch(即本示例中的“树”):

//Create a new configuration
Configuration conf = context.getConfiguration();
//retrieve the wordToSearch variable
String wordToSearch = conf.get("wordToSearch");

有关更多详细信息,请参阅此处。

 类似资料:
  • 问题内容: 对于这个新手问题,我感到很抱歉,但是我对编程还是有点陌生(从几天前开始)。基本上我想做的是保留一个文件,并保留另一个文件的所有单词出现 我知道我可以这样做: 事情是,在那之后,我想获取第二个文件,再次计算出现次数并更新第一个文件。之后,我取第三份文件,依此类推。 我在做什么,此刻工作没有任何问题(我使用,和),但它看起来相当缓慢。 我很确定使用,仅使用命令就可以有一种非常有效的方法,但

  • 问题内容: 计算单词在文件中出现的次数的简便方法是什么? 问题答案: 这还将在单行中计算单词的多次出现:

  • 我想读一个文本文件,打印出已知单词前面的单词,比如Java中的xxx。我使用Scanner类用java编写了这段代码。但是这段代码只打印了“xxx”前面的一半单词,而“xxx”前面的一些单词则丢失了。我想知道是什么问题,你能解决这个代码吗。 测试文件包含类似的内容

  • 问题内容: 我有一个具有以下格式的.txt文件, 尽管显然它要大得多,但实际上是这样。基本上,我试图总结每个单独字符串在文件中的次数(每个字母/字符串在单独的一行上,因此从技术上讲文件是C \ nV \ nEH \ n等。但是,当我尝试将这些文件转换为列表,然后使用count函数时,它会分离出字母,以使诸如’IRQ’之类的字符串为[‘\ n’I’,’R’ ,’Q’,’\ n’],这样当我计算它时,

  • 我正在开发一个学生项目,需要编写一个函数来计算单词中的音节。该函数就像长的CountSyllabl(String word)。 如何使用Java计算单词中的音节?有什么建议吗? 提供的规则是: > < li> 要计算音节数,您应该使用字母a、e、I、o、u、y作为元音。 计算单词中的元音数量。 不要计算双元音(例如,“rain”有2个元音,但只有1个音节) 如果单词中的最后一个字母是“e”,不要把

  • 问题内容: 好的,所以我有这个yaml文件,我想替换一个字符串 与字符串 但是我不知道该怎么办。这是完整的Yaml文件 问题答案: 假设您使用的操作系统不错,并且您的YAML文档称为: