使用Hadoop将列表作为值处理的最佳方法是什么?

时间:2013-05-05 20:33:03

标签: java hadoop mapreduce

我在完成我认为简单的任务时遇到了一些麻烦。我正在尝试迭代一个文件,每行有两个整数。目标是获取第一个整数并将其用作键值,并将第二个整数的值存储为列表,但前提是列表中不存在该值。所以,如果文件看起来像这样:

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,但我认为你不能动态地为它添加值。我不关心键的顺序。

1 个答案:

答案 0 :(得分:1)

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

对于您想要身份映射器的映射器,您希望完全按照读取方式输出密钥值对。这可以使用Identity Mapper完成,或者如果您使用的是新API,则不要指定一个, 0.23 +。

对于Reducer,您应该执行类似以下操作。这只是将给定键的值与您想要的逗号相关联,正如我之前提到的那样,您不需要将它们放入新数据结构中,因为它们已经在一个中。一旦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()));
}