Flink Window函数用法之一

  • flink三种窗口函数(时间窗口函数、计数窗口函数、会话窗口函数)
  • 时间窗口函数是整点起,左闭右开时间窗口,默认是早上08:00。如果想统计昨天一天00:00-24:00整点时间,可以使用偏移量设置:window(TumblingEventTimeWindows.of(Time.days(1), Time.hours(-8)))
  • 会话窗口不受起点时间限制,可以记录一段间隔时间内发生的事情
package com.transform
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.assigners.EventTimeSessionWindows
import org.apache.flink.streaming.api.windowing.time.Time
object WindowDemo {
  case class User(id: Int, sex: String, name: String, age: Int, ts: Long)
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) // 设置为事件时间
    env.setParallelism(1)//并行度为1,循序读取
    val dataStream = env.readTextFile("src/main/resources/window.csv")
        .map(x => {
          val arr = x.split(",")
          User(arr(0).toInt, arr(1), arr(2), arr(3).toInt, arr(4).toLong)
        })
        .assignAscendingTimestamps(_.ts * 1000L) //指定毫秒的时间字段
        .keyBy(_.sex)
    // 时间滚动窗口,四个([0,3),[3,6),[6,9),[9,12))左闭右开结果输出
    val tumblingWindowDataStream = dataStream
        .timeWindow(Time.seconds(3))
        .sum(3)
        .print("时间滚动窗口")

    // 时间滑动窗口,四个([-5,5),[0,10),[5,15),[10,20))左闭右开结果输出
    val sliceWindowDataStream = dataStream
      .timeWindow(Time.seconds(10), Time.seconds(5))
      .sum(3)
//      .print("时间滑动窗口")

    // 计数滚动窗口,三个([0,5),[5,10),[10,15))左闭右开结果输出
    val cTumblingWindowDataStream = dataStream
      .timeWindow(Time.seconds(5))
      .sum(3)
//      .print("计数滚动窗口")

    // 计数滑动窗口,四个([-5,5),[0,10),[5,15),[10,20))左闭右开结果输出
    val cSliceWindowDataStream = dataStream
      .timeWindow(Time.seconds(10), Time.seconds(5))
      .sum(3)
//      .print("计数滑动窗口")

    // 会话窗口,由于所有数据时间间隔都不大于1秒,所有累加所有时间输出(100)
    val sectionWindowDataStream = dataStream
      .window(EventTimeSessionWindows.withGap(Time.seconds(1)))
      .sum(3)
//      .print("会话窗口")
    env.execute("Window Job")
  }
}
  • 测试数据
1,男,张三,10,1609776001
2,男,刚刚,10,1609776002
3,男,熊熊,10,1609776003
4,男,李四,10,1609776004
5,男,王五,10,1609776005
6,男,小明,10,1609776006
7,男,小明,10,1609776007
8,男,小明,10,1609776008
9,男,小明,10,1609776009
10,男,小明,10,1609776010
11,女,红红,20,1609776011
  • 时间滚动结果示例
时间滚动窗口> User(1,男,张三,20,1609776001)
时间滚动窗口> User(3,男,熊熊,30,1609776003)
时间滚动窗口> User(6,男,小明,30,1609776006)
时间滚动窗口> User(9,男,小明,20,1609776009)
时间滚动窗口> User(11,女,红红,20,1609776011)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值