Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hadoop迭代器在第一次迭代时跳过方法调用_Java_Hadoop_Mapreduce_Iterator - Fatal编程技术网

Java Hadoop迭代器在第一次迭代时跳过方法调用

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&

我有一个MapReduce程序,在Reducer类中,我的方法在第一次迭代中没有被调用。我想要实现的是在迭代器中每2个连续值之间生成一些新行。(像:(1,2)、(2,3)、(3,4)这样的配对。)。我错过了什么?我还测试了我有我需要的对,看起来很好,但第一对似乎没有调用我的方法。。 generate()-将在每两个连续行之间生成新行(填补时间间隔)

输入:
十、 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方法添加逻辑。恐怕我不能。但它在其他输入行上工作得非常好。请保存我的一周!谢谢大家!@二进制书呆子