【问题标题】:Flink - how to compute sum and average at the same time?Flink - 如何同时计算总和和平均值?
【发布时间】:2017-05-17 23:03:26
【问题描述】:

Flink (batch/streaming) 中有没有办法同时计算一个字段的平均值和总和?使用聚合方法,我可以计算 groupBy 结果中字段的总和,但如何同时计算平均值?示例代码如下。

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
DataSet<Tuple3<String,Integer,Double>> source = 
         env.readCsvFile(PathConfig.LINEITEM_1)
         .fieldDelimiter("|")
         types(String.class, Integer.class, Double.class);

source.groupBy(0,1).aggregate(Aggregations.SUM, 2);
//average of field 2???

【问题讨论】:

  • 你能用 map/reduce 代替聚合吗?
  • 我可以使用reduceGroup手动计算总和和平均值,但是由于已经有一个很好的聚合求和函数,我想也许还有一种方法可以自动计算平均值。

标签: apache-flink flink-streaming


【解决方案1】:

对于 CSV 解析、分组和聚合等简单任务,我建议使用 Flink 的 Table API。

如果您想使用更多的低级 API,您可以实现一个 GroupReduce 函数来求和/计数(直到迭代器没有更多元素)并在最后产生最终平均值。

【讨论】:

  • 我不确定是否使用 Table API,因为它似乎有很多限制(比如流表没有连接)。我只是想知道是否有一种简单的方法来计算平均值,因为它应该只是一个简单的聚合函数,对吧?我在旧的源代码中看到确实有一个平均聚合函数,但在新版本中被注释掉了,我想知道这是为什么......
  • 是的,它有局限性,但是由于您可以在 DataStream 和 Table 之间来回切换,它是一个非常有用的工具。另请参阅:flink.apache.org/news/2017/03/29/table-sql-api-update.html 平均似乎很容易,但它需要两个操作(一个聚合步骤和一个用于除法的最终映射),并且返回类型取决于输入。最好让用户实现他/她需要的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 2018-10-09
  • 2018-05-16
  • 2018-09-26
相关资源
最近更新 更多