java - 每个文件计数的 WordCount 示例

标签 java apache hadoop mapreduce

我在获取每个文件的单词出现总数的分割时遇到了问题。
例如,我有四个文本文件(t1、t2、t3、t4)。单词 w1 在文件 t2 中出现了两次,在 t4 中出现了一次,总共出现了 3 次。
我想在输出文件中写入相同的信息。
我得到了每个文件中的总字数,但无法得到我想要的结果。

这是我的 map 课。

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
//line added
import org.apache.hadoop.mapreduce.lib.input.*;

public class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
private String pattern= "^[a-z][a-z0-9]*$";

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    String line = value.toString();
    StringTokenizer tokenizer = new StringTokenizer(line);
    //line added
    InputSplit inputSplit = context.getInputSplit();
    String fileName = ((FileSplit) inputSplit).getPath().getName();

    while (tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken());
        String stringWord = word.toString().toLowerCase();
        if ((stringWord).matches(pattern)){
            //context.write(new Text(stringWord), one);
            context.write(new Text(stringWord), one);
            context.write(new Text(fileName), one);
            //System.out.println(fileName);
            }
        }
    }
}

最佳答案

你可以通过写 word 来实现。如keyfilenamevalue .现在在你的 reducer 中为每个文件初始化单独的计数器并更新它们。一旦针对特定键迭代了所有值,然后将每个文件的计数器写入上下文。

在这里您知道您只有四个文件,因此您可以硬编码四个变量。请记住,您需要为在 reducer 中处理的每个新键重置变量。

如果文件数量更多,则可以使用 Map.在 map 上,filename将是 key并继续更新value .

关于java - 每个文件计数的 WordCount 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32969870/

相关文章:

java - 在 Controller (单例)中使用 HttpServletRequest 的范围是什么?

java - 如何使用Maven只签署三个jar并将它们推送到Maven Central?

apache - Nifi org.apache.thrift.transport.TTransportException

sql - Hive 查询逻辑和优化

java - 无法使用 Jackson 从对象值(无基于委托(delegate)或基于属性的创建者)反序列化

Java网络服务: use MVC or DAO+managers

apache - Ubuntu、Apache、虚拟主机和访问被禁止

apache - 协议(protocol)从 https 切换到 http 时出现 Cookie 和 Session id 问题

hadoop - 具有HDFS getmerge恢复的Parquet构建

join - Hadoop:是否可以将多个Map-Side连接在一起,似乎不是吗?