2013-04-25 83 views
1

我正在使用MapReduce中的程序。我有两个文件,我想从file2中存在的file1中删除一些信息。每行都有一个ID作为其关键字和一些数字(用逗号分隔)作为其值。如何过滤hadoop mapreduce中文件的记录值?

file1: 
1 1,2,10 
2 2,7,8,5 
3 3,9,12 

file2: 
1 1 
2 2,5 
3 3,9 

我想输出是这样的:

output:  
1 2,10 
2 7,8 
3 12 

我想删除在文件2相同的密钥文件1的值。一种方法是将这两个文件作为输入文件,并在映射步骤中生成:(ID, line)。然后在减少步骤中过滤这些值。但是,我的文件非常大,因此我不能这样做。

或者,如果file1是输入文件,并在地图中打开file2并寻找该行然后比较该值,它会有效吗?但是,因为我有一百万个密钥,而且每个密钥都必须打开file1,所以我认为它会有过多的I/O。

我该怎么办?

回答

0

您可以同时创建映射器的file1和file2输入。在映射器中,您可以将源(file1或file2)添加到记录中。然后使用二级排序来确保file2的记录始终排在第一位。因此,减速机的组合输入将如下所示:

1 file2,1 
1 file1,1,2,10 
2 file2,2,5 
2 file1,2,7,8,5 
3 file2,3,9 
3 file1,3,9,12 

您可以从这里获取减速机的设计。

+0

谢谢,但在这种方式我有很多关键值对和地图输出变得非常大。 – user1878364 2013-04-25 16:23:48

+0

这被称为BigData的原因;-)我其实是在想这些值是逗号分隔列表。所以你每个键最多可以得到2个值。 – Olaf 2013-04-25 19:00:16