我想构建一个 hadoop 应用程序,它可以从一个文件读取单词并在另一个文件中搜索。
如果该单词存在 - 它必须写入一个输出文件
如果该单词不存在 - 它必须写入另一个输出文件
我在hadoop中尝试了一些例子。我有两个问题
两个文件每个大约 200MB。检查另一个文件中的每个单词可能会导致内存不足。有没有其他方法可以做到这一点?
由于hadoop的reduce阶段的输出只写入一个文件,如何将数据写入不同的文件。是否可以有一个用于减少阶段的过滤器将数据写入不同的输出文件?
谢谢。
我会怎么做:
- 按单词拆分“map”中的值,发出 (,
- 你会得到“reduce”:(,
)
- 检查源列表(两个/所有源可能都很长)
- 如果并非所有源都在列表中,则每次都会发出 (, )
- job2: job.setNumReduceTasks()
- job2:在“map”中发出(,)
- 作业 2:在 'reduce' all (null, ) 中发出 foreach
您最终会得到与不同 一样多的归约输出,每个输出都包含文档中缺失的单词。您可以在“reduce”开头写出 ONCE 来标记文件。
(*1) 如何在地图 (0.20) 中查找来源:
private String localname;
private Text outkey = new Text();
private Text outvalue = new Text();
...
public void setup(Context context) throws InterruptedException, IOException {
super.setup(context);
localname = ((FileSplit)context.getInputSplit()).getPath().toString();
}
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
...
outkey.set(...);
outvalue.set(localname);
context.write(outkey, outvalue);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)