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 - 获取匹配文件的名称并打印到输出文件的主要内容,如果未能解决你的问题,请参考以下文章