在mapreduce作业中的单个行上应用字数

时间:2015-03-13 14:51:41

标签: java hadoop mapreduce word-count

我有一个像

这样的输入文件
LOW  LOW  HIGH LOW  LOW
LOW  HIGH MOD  LOW  LOW
HIGH LOW  HIGH HIGH HIGH
LOW  LOW  LOW  LOW  LOW
.     .    .    .    .
.     .    .    .    .

我希望得到如下结果:

Genuine
Moderate
Not_genuine
Genuine
 .
 .

为此,我需要解析一行并在每一行上应用WordCount,然后根据no。计数高或低我会指定所需的结果。 通过使用Stringtokenizer,所有行都会被考虑在内,split method也没有得到行(\n)的结尾。无论如何,我可以继续解决这个问题并获得所需的答案

完成代码的代码

这是我试图通过提取\n

来修改的mapper函数
public void map(LongWritable key, Text value, Context context) 
    throws IOException, InterruptedException {
  String line = value.toString();
  StringTokenizer tokenizer = new StringTokenizer(line);
  while (tokenizer.hasMoreTokens()) {
    if(tokenizer.equals("\n")){
      System.out.println("Line ends here");
      Log log = LogFactory.getLog(getClass());
      log.info("Line ends here");
      }
    word.set(tokenizer.nextToken());
    context.write(word, one);
}

3 个答案:

答案 0 :(得分:0)

在mapper类中,您可以使用hashset类型的机制来计算不同的单词。所以你不需要减速器。

答案 1 :(得分:0)

假设使用TextInputFormat,每个map()方法的输入value是一行。因此,最后有一个换行符是没有意义的。这就是您在log中看不到任何消息的原因。

正如Karthik建议的那样,你不需要减速器。你需要的只是汇总每个输入value(即行)的'HIGH','LOW'和'MOD'的数量并发出你的分类('Genuine','Moderate','Not-Genuine')直接来自mapper。

答案 2 :(得分:0)

我认为问题是你的输入文件。

使用以下代码检查输入文件是否正确。

public static void main(String agr[]) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(
            "yourfilelocation"));
    String line = null;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
}

之后,您可以编写用于计算Mapper中不同单词的逻辑。

希望这有帮助。