Java Apache Flink:在数据集上使用count()时,只执行此作业

Java Apache Flink:在数据集上使用count()时,只执行此作业,java,apache,count,dataset,apache-flink,Java,Apache,Count,Dataset,Apache Flink,我遇到了一个奇怪的问题:当我在其他处理(BulkIteration)之前对数据集使用count()时,ApacheFlink将只执行count()的计划并跳过我的其他操作。我在日志里找不到关于那件事的任何信息 而且,这在我的IDE中不会发生。所有的操作都在那里进行。只有通过WebUI上传时,才会出现这种问题 那么:这是一个普遍的问题吗?我如何解决这个问题而不必自己计算值 谢谢 更新: 代码做了类似的事情(好吧,我知道,这个例子不是为生产性代码设计的,但它显示了我的问题) import org.a

我遇到了一个奇怪的问题:当我在其他处理(BulkIteration)之前对数据集使用count()时,ApacheFlink将只执行count()的计划并跳过我的其他操作。我在日志里找不到关于那件事的任何信息

而且,这在我的IDE中不会发生。所有的操作都在那里进行。只有通过WebUI上传时,才会出现这种问题

那么:这是一个普遍的问题吗?我如何解决这个问题而不必自己计算值

谢谢

更新:

代码做了类似的事情(好吧,我知道,这个例子不是为生产性代码设计的,但它显示了我的问题)

import org.apache.flink.api.common.functions.MapFunction;
导入org.apache.flink.api.java.DataSet;
导入org.apache.flink.api.java.ExecutionEnvironment;
导入org.apache.flink.api.java.aggregation.Aggregations;
导入org.apache.flink.api.java.tuple.Tuple1;
导入java.util.LinkedList;
导入java.util.List;
导入java.util.Random;
公共类CountProblemExample{
公共静态void main(字符串[]args)引发异常{
随机rnd=新随机();
int randomNumber=100000+rnd.nextInt(100000);
List double=new LinkedList();
对于(int i=0;i0){
平均值=t.f0/计数;
}
返回平均值;
}
});
双平均值=平均值集
.collect()
.get(0);
系统输出打印项次(平均值);
}
}

您可能忘记调用
ExecutionEnvironment.execute()
。在调用该方法之前,不会执行数据集作业


DataSet.count()
DataSet.collect()
内部也会触发执行。

你能发布你的代码吗?是的,我稍后会更新我的代码。非常感谢。我已经编辑了我的文章,并包含了一个代码示例。如果你能帮助我,我会很高兴的!很好的提示,但是没有。我没有忘记,因为稍后会有一个collect()调用。如果我真的忘记了这一点,它在IDE中就不起作用了,我已经添加了一个代码示例,也许你可以对此说点什么?
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.aggregation.Aggregations;
import org.apache.flink.api.java.tuple.Tuple1;

import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class CountProblemExample {

    public static void main(String[] args) throws Exception {
        Random rnd = new Random();

        int randomNumber = 100000 + rnd.nextInt(100000);

        List<Double> doubles = new LinkedList<>();
        for (int i = 0; i < randomNumber; i++) {
            doubles.add(rnd.nextDouble());
        }

        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        DataSet<Double> doubleDataSet = env.fromCollection(doubles);

        final int count = (int)doubleDataSet.count(); // In the UI there the code stops further execution

        DataSet<Double> avgSet = doubleDataSet
                .map(new MapFunction<Double, Tuple1<Double>>() {
                    @Override
                    public Tuple1<Double> map(Double value) throws Exception {
                        return new Tuple1<>(value);
                    }
                })
                .aggregate(Aggregations.SUM, 0)
                .map(new MapFunction<Tuple1<Double>, Double>() {
                    @Override
                    public Double map(Tuple1<Double> t) throws Exception {
                        double avg = 0;
                        if (count > 0) {
                            avg = t.f0 / count;
                        }

                        return avg;
                    }
                });

        double avg = avgSet
                .collect()
                .get(0);

        System.out.println(avg);
    }

}