gpt4 book ai didi

java - 通过 MapReduce 读取与特定模式匹配的目录中的文件并输出单个文件的名称

转载 作者:可可西里 更新时间:2023-11-01 16:43:07 26 4
gpt4 key购买 nike

我正在尝试读取目录中的文件,该目录的路径被指定为 MapReduce 程序的参数。目的是对每个文件执行一些计算(比如特定单词的出现次数)。此外,文件名必须与模式匹配(例如 .java 文件)。程序的输出是文件名和计算值。

到目前为止,我已经能够实现一个非常基本的 Map 程序,该程序无需任何特定模式即可读取目录的内容并输出文件名和常数。映射器代码看起来像这样

 public class CCMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
private static IntWritable complexityCount = new IntWritable(1);
private Text result = new Text();

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{

String fileName = ((FileSplit) context.getInputSplit()).getPath().getName();
result.set(filePathString);
context.write(result, complexityCount);

}
}

输入目录有 3 个文件 - file1, file2, file3 。但是这个程序的输出看起来像这样

file1.txt   1
file1.txt 1
file1.txt 1
file1.txt 1
file1.txt 1
file1.txt 1
file1.txt 1
file2.txt 1
file2.txt 1
file2.txt 1
file2.txt 1
file3.txt 1

如何让程序为每个文件输出一次。还有一种方法可以一次读取一个文件,对该文件执行计算并输出文件名和结果吗?如何修改 InputSplit 的值以匹配每个特定文件的大小?

最佳答案

我了解到您的代码正在读取每个文件的内容。File1 必须有 7 行,因此键值对是“File1.txt 1”,每行一次。同样,File2.txt 必须有 4 行,而 File3.txt 必须有 1 行。

要输出每个文件出现一次,您必须在 reduce 函数中编写代码以根据键对值求和。

  public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {

@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}

context.write(key, new IntWritable(sum));
}

关于java - 通过 MapReduce 读取与特定模式匹配的目录中的文件并输出单个文件的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38918355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com