Flink的window操作之Window Functions(二)

版权声明:原创文章,转载请注明出处 https://blog.csdn.net/xianpanjia4616/article/details/85020049

上一篇中介绍了Flink中的window操作,接着介绍一下窗口函数.

Window Functions

在定义了窗口分配器之后呢,我们需要为每一个窗口明确的指定计算,这个就是窗口函数要做的事情,当系统决定一个窗口已经准备好执行之后,这个窗口函数将被用来处理窗口中的每一个元素(可能是分组的)。

窗口函数可以是ReduceFunction, FoldFunction , WindowFunction 他们三个中的一个。前面两个更高效一些,因为在每个窗口中增量地对每一个到达的元素执行聚合操作。一个 WindowFunction 可以获取一个窗口中的所有元素的一个迭代以及哪个元素属于哪个窗口的额外元信息。
  有WindowFunction的窗口化操作会比其他的操作效率要差一些,因为Flink内部在调用函数之前会将窗口中的所有元素都缓存起来。这个可以通过WindowFunction和ReduceFunction或者FoldFunction结合使用来获取窗口中所有元素的增量聚合和WindowFunction接收的额外的窗口元数据,接下来我们将看一看每一种变体的示例.

ReduceFunction

ReduceFunction指定了如何通过两个输入的参数进行合并输出一个同类型的参数的过程,Flink使用ReduceFunction来对窗口中的元素进行增量聚合。一个ReduceFunction 可以通过如下的方式来定义和使用:

val input: DataStream[(String, Long)] = ...

input
    .keyBy(<key selector>)
    .window(<window assigner>)
    .reduce { (v1, v2) => (v1._1, v1._2 + v2._2) }

 AggregateFunction

一个AggregateFunction是ReduceFunction的升级版本,有三个参数类型,输入,计算,输出,输入指的是输入流的每一个元素,AggregateFunction这个函数有一个方法把每一个输入的元素添加到一个累加器上面,这个接口还有一个初始化累加器的方法,

为了把两个累加器合并成一个并且输出,下面我们看一下,具体的实现.

class AverageAggregate extends AggregateFunction[(String, Long), (Long, Long), Double] {
  override def createAccumulator() = (0L, 0L)

  override def add(value: (String, Long), accumulator: (Long, Long)) =
    (accumulator._1 + value._2, accumulator._2 + 1L)

  override def getResult(accumulator: (Long, Long)) = accumulator._1 / accumulator._2

  override def merge(a: (Long, Long), b: (Long, Long)) =
    (a._1 + b._1, a._2 + b._2)
}

val input: DataStream[(String, Long)] = ...

input
    .keyBy(<key selector>)
    .window(<window assigner>)
    .aggregate(new AverageAggregate)

 FoldFunction

FoldFunction 指定了一个输入元素如何与一个输出类型的元素合并的过程,这个FoldFunction 会被每一个加入到窗口中的元素和当前的输出值增量地调用,第一个元素是与一个预定义的类型为输出类型的初始值合并。

val input: DataStream[(String, Long)] = ...

input
    .keyBy(<key selector>)
    .window(<window assigner>)
    .fold("") { (acc, v) => acc + v._2 }

如果有写的不对的地方,欢迎大家指正,如果有什么疑问,可以加QQ群:340297350,谢谢

猜你喜欢

转载自blog.csdn.net/xianpanjia4616/article/details/85020049