0

我在完成我认为很简单的任务时遇到了一些麻烦。我正在尝试遍历每行两个整数的文件。目标是获取第一个整数并将其用作键值,并将第二个整数的值存储为列表,但前提是该值不存在于列表中。因此,如果文件如下所示:

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

4

1 回答 1

1

因此,您的问题与经典的WordCount示例非常相似。在您的情况下,尽管您不想发出总和,而只是一次发出值。至于数据结构本身,它已经在一个数据结构Iterable的内部,所以没有必要将它们添加到一个新的数据结构中。您真正想做的只是以您需要的任何形式将它们打印出来。下面我将解释我认为整个程序需要什么。

对于您想要标识映射器的映射器,您希望完全按照您读取的方式输出键值对。这可以使用标识映射器来完成,或者如果您使用的是新的 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()));
}
于 2013-05-06T01:46:41.813 回答