Apache flink 在Flink中,为什么数据流不支持聚合

Apache flink 在Flink中,为什么数据流不支持聚合,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我是个新手。有时,我希望在数据流上进行聚合,而不需要先执行keyBy。为什么Flink不支持数据流上的聚合(sum、min、max等) 谢谢,, Ahmed.Flink支持对非键控流进行聚合,但必须先应用windowAll操作,然后才能应用聚合windowAll函数将并行度值降低到1,这意味着所有数据都将流经单个任务槽。这是出于设计原因,因为当您有多个任务槽时,您只能对该槽中可用的数据流进行聚合,而不能跨槽进行聚合 如果您的用例不适合将windowAll与parallelism one一起使用(

我是个新手。有时,我希望在数据流上进行聚合,而不需要先执行keyBy。为什么Flink不支持数据流上的聚合(sum、min、max等)

谢谢,,
Ahmed.

Flink支持对非键控流进行聚合,但必须先应用
windowAll
操作,然后才能应用聚合
windowAll
函数将并行度值降低到
1
,这意味着所有数据都将流经单个任务槽。这是出于设计原因,因为当您有多个任务槽时,您只能对该槽中可用的数据流进行聚合,而不能跨槽进行聚合

如果您的用例不适合将windowAll与parallelism one一起使用(即,当您有更多来自源的记录时),那么您可以尝试应用keyBy函数,然后应用aggregation,这将获得键集的聚合结果,然后再应用windowAll,最后应用aggregate函数。通过这种方式,您可以在不同的任务槽中按键进行聚合,然后最终在单个任务槽中对减少的数据进行聚合

以下是不带keyBy操作的windowAll示例

environment.fromCollection(list)
.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
.max(1)
environment.fromCollection(list)
.keyBy(1)
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.maxBy(1)
.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
.max(1)
以下是windowAll after keyBy操作的示例

environment.fromCollection(list)
.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
.max(1)
environment.fromCollection(list)
.keyBy(1)
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.maxBy(1)
.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
.max(1)

文档参考-

Flink支持对非键控流进行聚合,但您必须先应用
windowAll
操作,然后才能应用聚合
windowAll
函数将并行度值降低到
1
,这意味着所有数据都将流经单个任务槽。这是出于设计原因,因为当您有多个任务槽时,您只能对该槽中可用的数据流进行聚合,而不能跨槽进行聚合

如果您的用例不适合将windowAll与parallelism one一起使用(即,当您有更多来自源的记录时),那么您可以尝试应用keyBy函数,然后应用aggregation,这将获得键集的聚合结果,然后再应用windowAll,最后应用aggregate函数。通过这种方式,您可以在不同的任务槽中按键进行聚合,然后最终在单个任务槽中对减少的数据进行聚合

以下是不带keyBy操作的windowAll示例

environment.fromCollection(list)
.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
.max(1)
environment.fromCollection(list)
.keyBy(1)
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.maxBy(1)
.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
.max(1)
以下是windowAll after keyBy操作的示例

environment.fromCollection(list)
.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
.max(1)
environment.fromCollection(list)
.keyBy(1)
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.maxBy(1)
.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
.max(1)
文档参考-

Flink社区已决定从DataStream API中弃用所有这些关系方法:

  • DataStream#项目
  • Windowed/KeyedStream#sum,min,max,minBy,maxBy
  • DataStream#keyBy
    其中用字段名或索引指定的键(包括
    ConnectedStreams#keyBy
这一决定背后的基本原理是Table/SQL是一个更完整、性能更高的关系API,它已经支持批处理和流式处理。使用这些API,您可以轻松地执行全局聚合,而无需首先执行keyBy或GROUP-BY

例如:

StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tableEnv=StreamTableEnvironment.create(env);
SingleOutputStreamOperator number=env.fromElements(0,1,1,0,3,2);
Table data=tableEnv.fromDataStream(数字,$(“n”);
表结果=数据。选择($(“n”).max();
tableEnv
.toRetractStream(结果,行.类)
.print();
execute();
Flink社区决定从DataStream API中弃用所有这些关系方法:

  • DataStream#项目
  • Windowed/KeyedStream#sum,min,max,minBy,maxBy
  • DataStream#keyBy
    其中用字段名或索引指定的键(包括
    ConnectedStreams#keyBy
这一决定背后的基本原理是Table/SQL是一个更完整、性能更高的关系API,它已经支持批处理和流式处理。使用这些API,您可以轻松地执行全局聚合,而无需首先执行keyBy或GROUP-BY

例如:

StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tableEnv=StreamTableEnvironment.create(env);
SingleOutputStreamOperator number=env.fromElements(0,1,1,0,3,2);
Table data=tableEnv.fromDataStream(数字,$(“n”);
表结果=数据。选择($(“n”).max();
tableEnv
.toRetractStream(结果,行.类)
.print();
execute();

这在任务槽利用率方面是如何工作的?整个过程中只有1个或超过1个,然后最终减少到1?我认为优化器不够聪明,无法首先进行并行预聚合。您可以检查执行计划并进行检查,但如果您想要优化版本,我想您必须自己进行。在任务槽利用率方面,这在内部是如何工作的?整个过程中只有1个或超过1个,然后最终减少到1?我认为优化器不够聪明,无法首先进行并行预聚合。你可以检查执行计划并进行检查,但是如果你想要优化版本,我想你必须自己做。如果你觉得有用,你可以发表评论、投票或接受答案。否则,这个问题可能对未来的观众没有用处。如果你觉得有用,你可以发表评论、投票或接受答案。否则,这个问题可能对未来的观众没有用处。