Java Hadoop迭代器在第一次迭代时跳过方法调用
我有一个MapReduce程序,在Reducer类中,我的方法在第一次迭代中没有被调用。我想要实现的是在迭代器中每2个连续值之间生成一些新行。(像:(1,2)、(2,3)、(3,4)这样的配对。)。我错过了什么?我还测试了我有我需要的对,看起来很好,但第一对似乎没有调用我的方法。。 generate()-将在每两个连续行之间生成新行(填补时间间隔)Java Hadoop迭代器在第一次迭代时跳过方法调用,java,hadoop,mapreduce,iterator,Java,Hadoop,Mapreduce,Iterator,我有一个MapReduce程序,在Reducer类中,我的方法在第一次迭代中没有被调用。我想要实现的是在迭代器中每2个连续值之间生成一些新行。(像:(1,2)、(2,3)、(3,4)这样的配对。)。我错过了什么?我还测试了我有我需要的对,看起来很好,但第一对似乎没有调用我的方法。。 generate()-将在每两个连续行之间生成新行(填补时间间隔) 输入: 十、 Y,00:00:00908 十、 Y,00:00:05122 十、 Y,00:00:07123 Iterator<MyType&
输入:
十、 Y,00:00:00908
十、 Y,00:00:05122
十、 Y,00:00:07123
Iterator<MyType> iterator = values.iterator();
if (!iterator.hasNext()) return;
first = iterator.next();
while (iterator.hasNext()) {
nr++;
first.setStatus(nr);
context.write(nullWritable, first);
second = iterator.next();
List<MyType> newValues = generate(first, second, context);
for (MyType mt : newValues) {
mt.setStatus(nr);
context.write(nullWritable, mt);
}
second.setStatus(nr);
context.write(nullWritable, second);
first = new InterpolationModelWritable();
first.setX(second.getX());
first.setY(second.getY());
first.setZ(second.getZ());
first.setTag(second.getTag());
}
所需输出:
十、 Y,00:00:00908
十、 Y,00:00:01908
十、 Y,00:00:02908
十、 Y,00:00:03908
十、 Y,00:00:04908
十、 Y,00:00:05122
十、 Y,00:00:06122
十、 Y,00:00:07123
Iterator<MyType> iterator = values.iterator();
if (!iterator.hasNext()) return;
first = iterator.next();
while (iterator.hasNext()) {
nr++;
first.setStatus(nr);
context.write(nullWritable, first);
second = iterator.next();
List<MyType> newValues = generate(first, second, context);
for (MyType mt : newValues) {
mt.setStatus(nr);
context.write(nullWritable, mt);
}
second.setStatus(nr);
context.write(nullWritable, second);
first = new InterpolationModelWritable();
first.setX(second.getX());
first.setY(second.getY());
first.setZ(second.getZ());
first.setTag(second.getTag());
}
Iterator Iterator=values.Iterator();
if(!iterator.hasNext())返回;
first=迭代器.next();
while(iterator.hasNext()){
nr++;
第一,设置状态(nr);
write(可空写,第一个);
second=迭代器.next();
List newValues=generate(第一,第二,上下文);
对于(MyType mt:newValues){
塞斯塔图斯山(nr);
write(nullWritable,mt);
}
第二,固定状态(nr);
write(可空写,第二);
first=新插值ModelWritable();
第一个.setX(第二个.getX());
第一个.setY(第二个.getY());
first.setZ(second.getZ());
第一个.setTag(第二个.getTag());
}
实际结果:
十、 Y,00:00:00908
十、 Y,00:00:05122
十、 Y,00:00:06122
十、 Y,00:00:07123
您的代码的问题是您正落入hadoop对象重用陷阱。需要记住的重要一点是,reduce中的值迭代器并不是每次调用next()
时都返回一个新对象,而是重用同一个对象
Iterator<MyType> iterator = values.iterator();
if (!iterator.hasNext()) return;
first = iterator.next();
while (iterator.hasNext()) {
nr++;
first.setStatus(nr);
context.write(nullWritable, first);
second = iterator.next();
List<MyType> newValues = generate(first, second, context);
for (MyType mt : newValues) {
mt.setStatus(nr);
context.write(nullWritable, mt);
}
second.setStatus(nr);
context.write(nullWritable, second);
first = new InterpolationModelWritable();
first.setX(second.getX());
first.setY(second.getY());
first.setZ(second.getZ());
first.setTag(second.getTag());
}
现在我们知道,我们可以看看你的代码,找出哪里出了问题。使用您的逻辑(但作为一个最小的工作示例),我们可以看到它正常工作
@Test
public void noResuseIteratorTest() {
List<String> values = new ArrayList<>();
values.add("a");
values.add("b");
values.add("c");
values.add("d");
String first;
String second;
Iterator<String> iterator = values.iterator();
if (!iterator.hasNext()) return;
first = iterator.next();
while (iterator.hasNext()) {
second = iterator.next();
System.out.println("Out: " + first + " - " + second);
first = second;
}
}
输出:a-b输出:b-c
输出:c-d
你能详细谈谈你的问题吗?你到底在追求什么,问题是什么,真的不清楚。如果我想测试您的代码,根据您提供的内容是否可能?我需要示例输入、输出和您的预期输出。你调用了一个
generate
方法,那有什么用?@Binary Nerd你现在可以看到我的更新了。你可以为你的generate方法添加逻辑。恐怕我不能。但它在其他输入行上工作得非常好。请保存我的一周!谢谢大家!@二进制书呆子