Full Window Partition Processing on DataStream #
DataStream 上的全窗口分区处理
DataStream 上使用全窗口分区处理 API。Flink 现在支持键控(key)和非键控 (not key)DataStream 直接转换为 PartitionWindowedStream
。PartitionWindowedStream
表示将每个 subtask(子任务) 的所有记录分别收集到一个完整的窗口中。PartitionWindowedStream
支持 mapPartition
、sortPartition
、aggregate
和 reduce
四个 API。
注意:有关全窗口分区处理的设计和实现的详细信息,请参阅提案和设计文档 FLIP-380:支持非键控 DataStream 上的全分区处理。
MapPartition (数据完全进入窗口后,才执行处理)
MapPartition
表示将每个 subtask 的所有记录分别收集到一个完整的窗口中,并在每个 subtask 中使用给定的 MapPartitionFunction
处理它们。MapPartitionFunction
在输入结束时调用。
计算每个 subtask 中元素之和的示例如下:
DataStream<Integer> dataStream = //...
PartitionWindowedStream<Integer> partitionWindowedDataStream = dataStream.fullWindowPartition();
DataStream<Integer> resultStream = partitionWindowedDataStream.mapPartition(
new MapPartitionFunction<Integer, Integer>() {
@Override
public void mapPartition(
Iterable<Integer> values, Collector<Integer> out) {
int result = 0;
for (Integer value : values) {
result += value;
}
out.collect(result);
}
}
);
SortPartition # 排序分区(数据完全进入窗口后,才执行处理)
SortPartition
表示将每个 subtask 的所有记录分别收集到一个完整的窗口中,并在输入结束时按每个 subtask 中给定的记录比较器对它们进行排序。
在每个 subtask 中按 Tuples 的第一个元素对记录进行排序的示例如下:
DataStream<Tuple2<Integer, Integer>> dataStream = //...
PartitionWindowedStream<Tuple2<Integer, Integer>> partitionWindowedDataStream = dataStream.fullWindowPartition();
DataStream<Integer> resultStream = partitionWindowedDataStream.sortPartition(0, Order.ASCENDING);
Aggregate # 聚合
Aggregate
表示将每个 subtask 的所有记录分别收集到一个完整的窗口中,并将给定的 AggregateFunction
应用于该窗口的记录。为每个元素调用 AggregateFunction
,在窗口内以增量方式聚合值。
聚合每个 subtask 中的记录的示例如下:
DataStream<Tuple2<Integer, Integer>> dataStream = //...
PartitionWindowedStream<Tuple2<Integer, Integer>> partitionWindowedDataStream = dataStream.fullWindowPartition();
DataStream<Integer> resultStream = partitionWindowedDataStream.aggregate(new AggregateFunction<>{...});
Reduce # 减少
Reduce
表示对分区中的所有记录应用 reduce 转换。将为窗口中的每条记录调用 ReduceFunction
。示例如下:
DataStream<Tuple2<Integer, Integer>> dataStream = //...
PartitionWindowedStream<Tuple2<Integer, Integer>> partitionWindowedDataStream = dataStream.fullWindowPartition();
DataStream<Integer> resultStream = partitionWindowedDataStream.aggregate(new ReduceFunction<>{...});