在 mapreduce 作业中对单独的行应用 wordcount

Apply wordcount on individual lines in a mapreduce job

我有一个像

这样的输入文件
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,然后根据编号。高或低的计数我会指定所需的结果。 通过使用 Stringtokenizer 所有行都被考虑在内并且 split method 没有到达行尾 (\n)。无论如何我可以继续解决这个问题并获得所需的答案

为 MAPPER 完成的代码

这是我试图通过获取 \n

来修改的映射器函数
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);
}

在您的映射器 class 中,您可以使用哈希集类型的机制来计算不同单词的逻辑。所以你不需要减速器。

假设使用 TextInputFormat,每个 map() 方法的输入 value 是单行。因此,在末尾有一个换行符是没有意义的。这就是为什么您在 log.

中看不到任何消息的原因

正如 Karthik 所建议的,您不需要为此使用减速器。您所需要的只是汇总每个输入 value(即行)的 'HIGH'、'LOW' 和 'MOD' 的数量并发出您的分类('Genuine'、'Moderate', 'Not-genuine') 直接来自映射器。

我认为问题出在您的输入文件上。

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

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 中编写计算不同单词的逻辑了。

希望对您有所帮助。