因此,您的问题与经典的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()));
}