2013-05-05 46 views
0

我在完成我认为是一项简单的任务时遇到了一些麻烦。我试图迭代每行两个整数的文件。目标是获取第一个整数并将其用作键值,并将第二个整数的值作为列表存储,但前提是该值不在列表中。因此,如果该文件是这样的:使用Hadoop将列表作为值处理的最佳方式是什么?

3 11  
4 7 
5 10 
5 6 
6 5 
6 10 
3 11 #should be ignored 

那么理想,我有这样的事情在最后:

3 [11] 
4 [7] 
5 [10, 6] 
6 [5, 10] 

什么是有关的方面要对此最好的办法用于存储值的数据结构?我知道我可以使用ArrayWritable,但我不认为你可以动态地为它添加值。我不在乎钥匙的顺序。

+0

你想文本输出,或东西,你要开始的过程 - 即你想要一个序列文件(如果文本然后@greedybuddha目前的答案是可以接受的) – 2013-05-06 01:52:23

+0

我做了一些进展开始策划,但目前,文本表示没问题。 – 2013-05-06 17:09:01

回答

1

所以你的问题是非常类似于经典WordCount的例子。在你的情况下,虽然你不想发出总和,但只是一次性的价值。至于数据结构本身,它已经存在于数据结构中,即Iterable中,因此不需要将它们添加到新的数据结构中。你真正想做的只是以你需要的任何形式打印出来。下面我将解释我认为你需要整个项目的内容。

对于映射器,您想要标识映射器,您希望输出键值对,确切如何读取它。可以使用Identity Mapper完成,或者如果您使用新的API,则不需要指定一个,0.23+。

对于Reducer,你应该做类似于下面的事情。这只是简单地将给定键的值附加了您想要的逗号,正如我之前提到的,您不需要将它们放入新的数据结构中,因为它们已经在一个中。一旦减速器完成附加一个键的值,那么它只是发出带有逗号分隔值的键。

@Override 
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 
    StringBuilder sb = new StringBuilder(); 
    boolean first = true; 
    for (Text value: values){ 
     if (!first) sb.append(", "); 
     else first = false; 
     sb.append(value); 
    } 
    context.write(key, new Text(sb.toString())); 
} 
相关问题