我在Hadoop中有一个基本场景:
所有地图制作工具都会将所有值发送到相同的键。因此,所有值都以相同减速器结束。
但是,当我迭代reducer中的值时,迭代器不会处理所有条目。
例如,我可以使用以下代码:
while (values.hasNext())
{
result = result + values.next().toString() + "\n";
}
// Assume, that all values sent to this reducer is now in the 'result' variable
do_important_stuff(result);
我想累积相关的值,然后处理函数'do_important_stuff()'中的数据。但我无法这样做 - while循环过早中断。
我是否错过了关于Hadoop的关键点?我的假设是错的吗?
答案 0 :(得分:1)
您正在使用
控制循环values.hasNext()
但正在推进
rows.next()
rows
和values
是同一个对象吗?我怀疑是一个错字。 :)
答案 1 :(得分:0)
问题似乎是由于分配引用而不是值。
使用ArrayList作为累加器并克隆每个值,例如:
result = new ArrayList<Text>();
while (values.hasNext())
{
result.add(new Text(values.next());
}
迭代器将以列表中的所有所需值终止。