繁体   English   中英

使用Java使用Apache Flink减少Pojo字段

[英]Reduce on Pojo field with Apache Flink using Java

目前,我正在为某些分布式处理工具构建基准测试工具,但Apache Flink遇到了一些麻烦。

设置很简单:LogPojo是具有三个字段(长日期,双精度值,字符串数据)的简单Pojo。 在列表之外,我正在寻找一个具有最小“值”字段的LogPojo。 基本上相当于:

pojoList.stream().min(new LogPojo.Comp()).get().getValue();

我的flink设置如下所示:

public double processLogs(List<LogPojo> logs) {

    final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

    DataSet<LogPojo> logSet = env.fromCollection(logs);

    double result = 0.0;
    try {
        ReduceOperator ro = logSet.reduce(new LogReducer());
        List<LogPojo> c = ro.collect();
        result = c.get(0).getValue();
    } catch (Exception ex) {
        System.out.println("Exception caught" + ex);
    }

    return result;
}

public class LogReducer implements ReduceFunction<LogPojo> {

    @Override
    public LogPojo reduce(LogPojo o1, LogPojo o2) {
        return (o1.getValue() < o2.getValue()) ? o1 : o2;
    }
}

它的结尾是:

Exception in thread "main" java.lang.NoSuchMethodError: scala.collection.immutable.HashSet$.empty()Lscala/collection/immutable/HashSet;

因此,似乎无法应用reduce函数。 我只是找不到,为什么。 有什么提示吗?

首先,您应该检查您的进口。 您从Scala类获得了异常,但是您的程序是用Java实现的。 您可能不小心导入了Scala DataSet API。 使用Java API不应导致Scala异常(除非您使用的是依赖于Scala的类)。

无论如何,Flink具有针对minmax等的内置聚合方法。

DataSet<LogPojo> logSet = env.fromCollection(logs);
// map LogPojo to a Tuple1<Double> 
//   (Flink's built-in aggregation functions work only on Tuple types)
DataSet<Tuple1<Double>> values = logSet.map(new MapFunction<LogPojo, Tuple1<Double>>() {
    @Override
    public Tuple1<Double> map(LogPojo l) throws Exception {
      return new Tuple1<>(l.value);
    }
  });
// fetch the min value (at position 0 in the Tuple)
List<Tuple1<Double>> c = values.min(0).collect();
// get the first field of the Tuple
Double minVal = c.get(0).f0;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM