Java 基于MapReduce的倒排索引

Java 基于MapReduce的倒排索引,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我正在尝试为以下问题实现反向索引:我得到一个包含X个文件量的目录,我需要生成以下格式的输出: word : totalCount : [ (file_name, file_count) (file_name, file_count) ...] 例如,我们可以: dog : 200 : [(file1, 30) (file2, 43) ....] 我实现了一个针对每个文档的作业,并输出每个文档中每个单词出现的次数。然而,我不知道我现在应该如何进行,以便获得所有文件的计数 如果我有一个包含10个

我正在尝试为以下问题实现反向索引:我得到一个包含X个文件量的目录,我需要生成以下格式的输出:

word : totalCount : [ (file_name, file_count) (file_name, file_count) ...]
例如,我们可以:

dog : 200 : [(file1, 30) (file2, 43) ....]
我实现了一个针对每个文档的作业,并输出每个文档中每个单词出现的次数。然而,我不知道我现在应该如何进行,以便获得所有文件的计数


如果我有一个包含10个文档的目录,并且我的输入是目录本身的路径,那么如何为每个文档执行10个作业?另外,如何设置从10个单独作业中获取输出的作业?我知道如何实现减速器的逻辑,但是我不确定如何设置作业配置本身以确保其正常工作

这可以在单个map reduce作业中完成。将所有输入路径传递给map reduce作业

按以下步骤做

映射输出:关键字、文件名值-计数

分区的:仅基于word

组分区:再次基于Word

现在在Recurder中,您将有如下输入

Dog,file1,1
Dog,file1,1
Dog,file2,1
Dog,file2,1 

迭代键(我们仅基于组压缩程序将键作为单词)dog。然后对每个文件进行计数,然后将其添加并进行总计数。

如果我将整个目录传递给map reduce作业,映射程序如何知道它当前处理的是哪个文档?如何将输入数据拆分为单个文档?首先,map reduce将处理目录中的所有文件。它将根据您的输入拆分启动map reduce。要在映射方法中获取文件名,请使用字符串fileName=((FileSplit)context.getInputSplit()).getPath().getName();我如何确保进入第一个映射器的大多数输入来自文档1,然后是文档2等。我检查映射器中每个单词出现次数的方法是按字母顺序对输入进行排序,问题是,我只想先按字母顺序对doc_1中的输入进行排序,然后再触摸doc_2。为什么要确保?为什么需要在mapper中进行排序?我没有得到你想要的。你能举个例子吗。正如我在mapper中所说的,我只写。排序将在map reduce作业的排序阶段进行。组内压缩程序只取关键字的字部分。