全量窗口函数ProcessWindowFunction

ProcessWindowFunction

在某些情况下,统计更复杂的指标可能需要依赖于窗口中所有的数据元素,或需要操作窗口中的状态数据和窗口元数据,这时就需要使用到ProcessWindowsFunction,ProcessWindowsFunction 能够更加灵活地支持基于窗口全部数据元素的结果计算, 例如对整个窗口数据排序取 TopN , 这样的需要就必须使用ProcessWindowFunction。


object TestProcessFuntionWindow
{
  def main(args: Array[String]): Unit =
  {

    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val socketStream = env.socketTextStream("localhost", 9999)
    /*获取stream 读取数据源 */

    val stream = socketStream.map(line =>
    {
      import com.jh.source.StationLog
      val splited = line.split(",")
      StationLog(splited(0).trim, splited(1).trim, splited(2).trim, splited(3).trim, splited(4).trim.toLong, splited
      (5).trim.toLong)
    })
    stream.map(log => (log.sid, 1.toLong))
      .keyBy(_._1)
      .window(SlidingProcessingTimeWindows.of(Time.seconds(5), Time.seconds(3)))

      /*IN, OUT, KEY, W <: Window*/
      .process(new ProcessWindowFunction[(String, Long), (String, Long), String, TimeWindow]
      {
        /*一个窗口结束调用一次(在一个并行度中),因为他是全量的聚合函数*/
        override def process(key: String, context: Context, elements: Iterable[(String, Long)], out: Collector[
          (String, Long)]): Unit =
        {
          println("----------")
          /*注意:整个窗口的数据保存到 Iterable 里面有很多数据  迭代器的size就是日志的总条数 */
          out.collect((key, elements.size))
        }
      })
      .print()
    env.execute()

  }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值