flink学习笔记-flink的window介绍、window聚合统计(增量,全量)

  • 窗口类型汇总
    在这里插入图片描述
  • 窗口的基本类型介绍
    • tumbling windows:滚动窗口——没有数据重叠
      在这里插入图片描述
    • sliding windows:滑动窗口——有数据重复
      在这里插入图片描述
    • session windows:会话窗口 ——很少用这里就不赘述了
  • Time Window
    • time window又分为滚动窗口和滑动窗口,这两种窗口调用方法都是一样的,都是调用timeWindow这个方法,如果传入一个参数就是滚动窗口,如果传入两个参数就是滑动窗口
  • Count Windos
    • 与timeWindow类型,CountWinodw也可以分为滚动窗口和滑动窗口,这两个窗口调用方法一样,都是调用countWindow,如果传入一个参数就是滚动窗口,如果传入两个参数就是滑动窗口
  • 自定义window
    • 如果time window和 countWindow还不够用的话,我们还可以使用自定义window来实现数据的统计等功能
      在这里插入图片描述
  • window的数值聚合统计
    • 对于某一个window内的数值统计,我们可以增量的聚合统计或者全量的聚合统计
      • 增量聚合统计
      • 窗口当中每加入一条数据,就进行一次统计
        • reduce(reduceFunction)
        • aggregate(aggregateFunction)
        • sum(),min(),max()
      • 通过接收socket当中输入的数据,统计每5秒钟数据的累计的值
      import org.apache.flink.api.common.functions.ReduceFunction
      import org.apache.flink.streaming.api.datastream.DataStreamSink
      import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}
      import org.apache.flink.streaming.api.windowing.time.Time
      
      object FlinkTimeCount {
        def main(args: Array[String]): Unit = {
          val environment: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
          import org.apache.flink.api.scala._
      
          val socketStream: DataStream[String] = environment.socketTextStream("node01",8000)
          val print: DataStreamSink[(Int, Int)] = socketStream
            .map(x => (1, x.toInt))
            .keyBy(0)
            .timeWindow(Time.seconds(5))
            .reduce(new ReduceFunction[(Int, Int)] {
              override def reduce(t: (Int, Int), t1: (Int, Int)): (Int, Int) = {
                (t._1, t._2 + t1._2)
              }
            }).print()
      
          environment.execute("startRunning")
        }
      }
      
      • 全量聚合统计
        • 等到窗口截止,或者窗口内的数据全部到齐,然后再进行统计,可以用于求窗口内的数据的最大值,或者最小值,平均值等
        • apply(windowFunction)
        • process(processWindowFunction)
        • processWindowFunction比windowFunction提供了更多的上下文信息
        • 通过全量聚合统计,求取每3条数据的平均值
      import org.apache.flink.api.java.tuple.Tuple
      import org.apache.flink.streaming.api.datastream.DataStreamSink
      import org.apache.flink.streaming.api.scala.function.ProcessWindowFunction
      import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment, WindowedStream}
      import org.apache.flink.streaming.api.windowing.windows.{GlobalWindow, TimeWindow}
      import org.apache.flink.util.Collector
      
      
      object FlinkCountWindowAvg {
      
        def main(args: Array[String]): Unit = {
          val environment: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
      
          import org.apache.flink.api.scala._
          val socketStream: DataStream[String] = environment.socketTextStream("node01",9000)
          //统计一个窗口内的数据的平均值
          val socketDatas: DataStreamSink[Double] = socketStream.map(x => (1, x.toInt))
            .keyBy(0)
            //.timeWindow(Time.seconds(10))
            .countWindow(3)
            //通过process方法来统计窗口的平均值
            .process(new MyProcessWindowFunctionclass).print()
          //必须调用execute方法,否则程序不会执行
          environment.execute("count avg")
        }
      }
      
      /**ProcessWindowFunction 需要跟四个参数
        * 输入参数类型,输出参数类型,聚合的key的类型,window的下界
        *
        */
      class MyProcessWindowFunctionclass extends ProcessWindowFunction[(Int , Int) , Double , Tuple , GlobalWindow]{
        override def process(key: Tuple, context: Context, elements: Iterable[(Int, Int)], out: Collector[Double]): Unit = {
          var totalNum = 0;
          var countNum = 0;
          for(data <-  elements){
            totalNum +=1
            countNum += data._2
          }
          out.collect(countNum/totalNum)
        }
      }
      
发布了40 篇原创文章 · 获赞 59 · 访问量 1400

猜你喜欢

转载自blog.csdn.net/qq_26719997/article/details/105053343