Flink table api 与flink sql 分组窗口与over窗口

①滚动窗口

val resultTable = tableFromStream.window(Tumble.over(10.seconds).on("ts") as 'tw)
      .groupBy('tw,'id)
      .select('id,'id.count,'temp.avg)

    val resultSqlTable = tabEnv.sqlQuery(
      """
        |select id
        |,count(*) as cnt
        |,avg(temp) as avg_temp
        |,tumble_end(ts,interval '10' second)
        |from input_stream_table
        |group by tumble(ts,interval '10' second),id
        |""".stripMargin)

②滑动窗口

    val resultSlideTable = tableFromStream.window(Slide.over(10.seconds).every(5.seconds).on('ts) as 'sw)
      .groupBy('sw,'id)
      .select('id,'id.count,'temp.avg)

    val resultSqlSlideTable = tabEnv.sqlQuery(
      """
        |select id
        |,count(*) as cnt
        |,avg(temp) as avg_temp
        |,hop_end(ts,interval '5' second,interval '10' second)
        |from input_stream_table
        |group by id,hop(ts,interval '5' second,interval '10' second)
        |""".stripMargin)

③会话窗口

val resultSessionTable = 
tableFromStream.window(Session.withGap(10.seconds).on('ts) as 'sew)
      .groupBy('sew,'id)
      .select('id,'id.count,'temp.avg)
    
    val resultSqlSessionTable = tabEnv.sqlQuery(
      """
        |select id
        |,count(*) as cnt
        |,avg(temp) as avg_temp
        |,session_end(ts,interval '10' second)
        |from input_stream_table
        |group by session(ts,interval '10' second),id
        |""".stripMargin)

另外还有一些辅助函数,可以用来选择 Group Window 的开始和结束时间戳,以及时间
属性。
这里只写 TUMBLE_,滑动和会话窗口是类似的(HOP_,SESSION_*)。
 TUMBLE_START(time_attr, interval)
 TUMBLE_END(time_attr, interval)
 TUMBLE_ROWTIME(time_attr, interval)
 TUMBLE_PROCTIME(time_attr, interval)
Over窗口
无界over window

// 无界的事件时间 over window
.window(Over partitionBy 'a orderBy 'rowtime preceding UNBOUNDED_RANGE as 'w)
// 无界的事件时间 Row-count over window
.window(Over partitionBy 'a orderBy 'rowtime preceding UNBOUNDED_ROW as 'w)
有界over window
// 有界的事件时间 over window
.window(Over partitionBy 'a orderBy 'rowtime preceding 1.minutes as 'w)
// 有界的事件时间 Row-count over window
.window(Over partitionBy 'a orderBy 'rowtime preceding 10.rows as 'w)
Table api实现
val resultTable = table
.window(Over.partitionBy(“id”).orderBy(“rt”).preceding(3.rows) as 'ow)
.select('id,'id.count over 'ow,'temp.avg over 'ow)
Flink 实现
val resultSqlTable = tabEnv.sqlQuery(
“”"
|select id
|,count(id)
|,avg(temp)
|from input_table
|group by id
|window ow as (partition by id order by rt rows between 2 PRECEDING and current row)
|""".stripMargin)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值