Java Mapreduce - 获取匹配文件的名称并打印到输出文件

Posted

技术标签:

【中文标题】Java Mapreduce - 获取匹配文件的名称并打印到输出文件【英文标题】:Java Mapreduce - getting names of files with matches & printing to output file 【发布时间】:2019-06-28 05:49:40 【问题描述】:

您好,我一直在尝试提出标准 WordCount v1.0 的修改版本 其中我从输入目录(args[0])读取所有文件,并将输出打印到输出目录(args[1]),其中不仅包含单词和出现次数,还包含文件列表比赛地点。

例如,我有 2 个文本文件:

//1.txt
I love hadoop
and big data

//2.txt
I like programming
hate big data

输出将是:

//Output.txt
I       2   1.txt 2.txt
love    1   1.txt
hadoop  1   1.txt
and     1   1.txt
big     2   1.txt 2.txt
data    2   1.txt 2.txt
like    1   1.txt
programming  1  2.txt
hate    1   2.txt

在这个阶段,我不确定如何提取发生匹配的文件的名称。此外,我不确定如何存储文件名 - 我是使用 Triple 还是需要使用嵌套地图,所以也许 Map (K1, Map (K2, v))?我不知道在 mapreduce 程序中哪些是可能的,所以任何提示将不胜感激。

【问题讨论】:

【参考方案1】:

通常不鼓励获取文件名。不同的输入格式有不同的方法,其中一些可能根本不提供这样的功能。

假设您正在使用简单的TextInputFormat,您可以使用映射器上下文来检索拆分:

FileSplit split = (FileSplit)context.getInputSplit();
String filename = split.getPath().getName();

要生成所需的格式,让 mapper 发出元组 <Text(word),Text(filename)>。 Reducer 应该将它们收集到Map<String(word), Set<String>(filename)>。这假设没有使用组合器。

【讨论】:

感谢您的提示。顺便说一句,我的 args[0] 将是一个输入目录。在这种情况下,Filesplit 还会返回允许我提取文件名吗? 是的,每个映射器都会得到一个 FileSplit,它指向某个特定文件的某个特定字节范围。

以上是关于Java Mapreduce - 获取匹配文件的名称并打印到输出文件的主要内容,如果未能解决你的问题,请参考以下文章

大数据技术使用java实现MapReduce对文件进行切分,分类汇总

shell调用mapreduce结束后无法获取结束状态

hadoop MapReduce 读取配置参数

如何获取hadoop mapreduce job运行信息

如何获取hadoop mapreduce job运行信息

MapReduce编程入门及HDFS-JAVA接口