java - Apache 弗林克 : When using count() on DataSet only this job will be executed

标签 java count dataset apache-flink

我遇到了一个奇怪的问题:当我在其他处理(BulkIteration)之前在数据集上使用 count() 时,apache flink 将只执行 count() 的计划并跳过我的其他操作。我在日志中找不到任何相关内容。

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

那么:这是一个普遍问题吗?我怎样才能解决这个问题而不必自己计算值计数?

谢谢!

更新:

该代码执行类似的操作(嗯,我知道,这个示例并不是为高效代码而设计的,但它显示了我的问题)。

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);
    }

}

最佳答案

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

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

关于java - Apache 弗林克 : When using count() on DataSet only this job will be executed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46974043/

相关文章:

swift - 如何获得Realm中最具代表性的值(value)?

mysql - COUNT 组的 mysql 总数

python-3.x - 使用代理加载 fetch_lfw_people

java - 从输入流下载 10 个项目到下一个项目到下一个项目 - android

java - GPU 计算能力可以用于图像转换(tiff 到 jpeg)吗?如果是的话如何实现

java - 使用 auto-factory 生成的工厂无法导入 glide 生成的 api

vb.net - 创建具有多个表的(循环中)数据集

java - 在不使用条件代码的情况下确定数字是奇数还是偶数

MySQL 查询仅选择一个条目

scala - 根据包含列表元素的列值创建 bool 标志