Windowing TVF

在Flink1.13版本之后出现的替代之前的Group window的产物,官网描述其 is more powerful and effective

 //TVF 中的tumble滚动窗口
 //tumble(table sensor,descriptor(et),interval '5' second ):作为一张表存在
 //特别注意!!!!
 //如果在sql中使用了tumble窗口,则一定需要group by,而且group by后一定有window_start,window_end两个字段

sql实现TVF的tumble窗口实现

 package net.cyan.FlinkSql.TVF;
 ​
 import net.cyan.POJO.WaterSensor;
 import org.apache.flink.api.common.eventtime.WatermarkStrategy;
 import org.apache.flink.streaming.api.datastream.DataStream;
 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
 import org.apache.flink.table.api.Table;
 import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
 ​
 import java.time.Duration;
 ​
 import static org.apache.flink.table.api.Expressions.$;
 ​
 public class Demo1_Window_TableAPI_Tumble {
     public static void main(String[] args) {
         //创建执行环境
         StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
         //创建表的运行环境
         StreamTableEnvironment tabEnv = StreamTableEnvironment.create(env);
         env.setParallelism(1);
         DataStream<WaterSensor> waterSensorStream =
                 env.fromElements(
                         new WaterSensor("sensor_1", 1000L, 10),
                         new WaterSensor("sensor_1", 2000L, 20),
                         new WaterSensor("sensor_2", 3000L, 30),
                         new WaterSensor("sensor_1", 4000L, 40),
                         new WaterSensor("sensor_1", 5000L, 50),
                         new WaterSensor("sensor_2", 6000L, 60))
                        .assignTimestampsAndWatermarks(
                                 WatermarkStrategy
                                        .<WaterSensor>forBoundedOutOfOrderness(Duration.ofSeconds(3))
                                        .withTimestampAssigner((ws, ts) -> ws.getTs())
 ​
                        );
         //创建table
         Table table = tabEnv.fromDataStream(waterSensorStream,$("id"),$("ts"),$("vc"),$("et").rowtime());
         //创建表
         tabEnv.createTemporaryView("sensor",table);
         //执行sql
         //TVF 中的tumble滚动窗口
         //tumble(table sensor,descriptor(et),interval '5' second ):作为一张表存在
         //特别注意!!!!
         //如果在sql中使用了tumble窗口,则一定需要group by,而且group by后一定有window_start,window_end两个字段
         tabEnv.sqlQuery("select" +
                 " window_start,window_end,id," +
                 "sum(vc) sum_vc" +
                 " from table (tumble(table sensor,descriptor(et),interval '5' second ))" +
                 " group by window_start,window_end,id ")
                .execute()
                .print();
 ​
    }
 }

sql实现TVF的滑动窗口

 //TVF 中的hop滚动窗口
 //hop(table sensor,descriptor(et),interval '2' second,interval '5' second ):作为一张表存在
 //first interval :滑动步长, second interval :窗口长度
 //特别注意!!!!
 // 1.TVF 中滑动窗口的滑动步长与窗口长度必须是整数倍的关系,不然会报错
 // 例如:滑动步长为2,窗口长度就不能为5,可以为6
 // 2.如果在sql中使用了hop窗口,则一定需要group by,而且group by后一定有window_start,window_end两个字段
 package net.cyan.FlinkSql.TVF;
 ​
 import net.cyan.POJO.WaterSensor;
 import org.apache.flink.api.common.eventtime.WatermarkStrategy;
 import org.apache.flink.streaming.api.datastream.DataStream;
 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
 import org.apache.flink.table.api.Table;
 import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
 ​
 import java.time.Duration;
 ​
 import static org.apache.flink.table.api.Expressions.$;
 ​
 public class Demo2_Window_TVF_Hop {
     public static void main(String[] args) {
         //创建执行环境
         StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
         //创建表的运行环境
         StreamTableEnvironment tabEnv = StreamTableEnvironment.create(env);
         env.setParallelism(1);
         DataStream<WaterSensor> waterSensorStream =
                 env.fromElements(
                         new WaterSensor("sensor_1", 1000L, 10),
                         new WaterSensor("sensor_1", 2000L, 20),
                         new WaterSensor("sensor_2", 3000L, 30),
                         new WaterSensor("sensor_1", 4000L, 40),
                         new WaterSensor("sensor_1", 5000L, 50),
                         new WaterSensor("sensor_2", 6000L, 60))
                        .assignTimestampsAndWatermarks(
                                 WatermarkStrategy
                                        .<WaterSensor>forBoundedOutOfOrderness(Duration.ofSeconds(3))
                                        .withTimestampAssigner((ws, ts) -> ws.getTs())
 ​
                        );
         //创建table
         Table table = tabEnv.fromDataStream(waterSensorStream,$("id"),$("ts"),$("vc"),$("et").rowtime());
         //创建表
         tabEnv.createTemporaryView("sensor",table);
         //执行sql
         //TVF 中的hop滚动窗口
         //hop(table sensor,descriptor(et),interval '2' second,interval '5' second ):作为一张表存在
         //first interval :滑动步长, second interval :窗口长度
         //特别注意!!!!
         // 1.TVF 中滑动窗口的滑动步长与窗口长度必须是整数倍的关系,不然会报错
         // 例如:滑动步长为2,窗口长度就不能为5,可以为6
         // 2.如果在sql中使用了hop窗口,则一定需要group by,而且group by后一定有window_start,window_end两个字段
         tabEnv.sqlQuery("select" +
                 " window_start,window_end,id," +
                 "sum(vc) sum_vc" +
                 " from table (hop(table sensor,descriptor(et),interval '2' second,interval '6' second ))" +
                 " group by window_start,window_end,id ")
                .execute()
                .print();
 ​
 ​
 ​
    }
 }

sql实现TVF的累计窗口

累计窗口的应用:

需求:每天每隔一个小时统计一次当天的pv(浏览量)

流的方式如何解决:

1、用滚动窗口, 窗口长度设为1h

2、每天的第一个窗口清除状态,后面的不清,进行状态的累加

或者

用滚动窗口,长度设置为2day

自定义触发器,每隔1小时对窗内的元素计算一次,不关闭窗口

sql的方式如何解决?

直接使用累计窗口cumulate

 //TVF 中的cumulate累计窗口
 //cumulate(table tableName,descriptor(timecol),step,size):作为一张表存在
 //tableName:表名
 //timecol:时间属性字段
 //step:累计步长,跟滑动步长类似
 //size:窗口长度
 //特别注意!!!!
 //1.累计窗口的步长与窗口长度同样是需要整数倍关系
 // 2.如果在sql中使用了cumulate窗口,则一定需要group by,而且group by后一定有window_start,window_end两个字段
 package net.cyan.FlinkSql.TVF;
 ​
 import net.cyan.POJO.WaterSensor;
 import org.apache.flink.api.common.eventtime.WatermarkStrategy;
 import org.apache.flink.streaming.api.datastream.DataStream;
 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
 import org.apache.flink.table.api.Table;
 import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
 ​
 import java.time.Duration;
 ​
 import static org.apache.flink.table.api.Expressions.$;
 ​
 public class Demo3_Window_TVF_cumulate {
     public static void main(String[] args) {
         //创建执行环境
         StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
         //创建表的运行环境
         StreamTableEnvironment tabEnv = StreamTableEnvironment.create(env);
         env.setParallelism(1);
         DataStream<WaterSensor> waterSensorStream =
                 env.fromElements(
                         new WaterSensor("sensor_1", 1000L, 10),
                         new WaterSensor("sensor_1", 2000L, 20),
                         new WaterSensor("sensor_2", 3000L, 30),
                         new WaterSensor("sensor_1", 4000L, 40),
                         new WaterSensor("sensor_1", 5000L, 50),
                         new WaterSensor("sensor_2", 6000L, 60))
                        .assignTimestampsAndWatermarks(
                                 WatermarkStrategy
                                        .<WaterSensor>forBoundedOutOfOrderness(Duration.ofSeconds(3))
                                        .withTimestampAssigner((ws, ts) -> ws.getTs())
 ​
                        );
         //创建table
         Table table = tabEnv.fromDataStream(waterSensorStream,$("id"),$("ts"),$("vc"),$("et").rowtime());
         //创建表
         tabEnv.createTemporaryView("sensor",table);
         //执行sql
         //TVF 中的cumulate累计窗口
         //cumulate(table tableName,descriptor(timecol),step,size):作为一张表存在
         //tableName:表名
         //timecol:时间属性字段
         //step:累计步长,跟滑动步长类似
         //size:窗口长度
         //特别注意!!!!
         //1.累计窗口的步长与窗口长度同样是需要整数倍关系
         // 2.如果在sql中使用了cumulate窗口,则一定需要group by,而且group by后一定有window_start,window_end两个字段
         tabEnv.sqlQuery("select" +
                 " window_start,window_end,id," +
                 " sum(vc) sum_vc" +
                 " from table (cumulate(table sensor,descriptor(et),interval '2' second,interval '6' second)) " +
                 "group by window_start,window_end,id")
                .execute()
                .print();
    }
 }
 

FlinkSQL之Windowing TVF的更多相关文章

  1. Flink 实践教程-进阶(5):排序(乱序调整)

    作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...

  2. Storm Windowing storm滑动窗口简介

    Storm Windowing 简介 Storm可同时处理窗口内的所有tuple.窗口可以从时间或数量上来划分,由如下两个因素决定: 窗口的长度,可以是时间间隔或Tuple数量: 滑动间隔(slidi ...

  3. SQL Server 性能优化之——T-SQL TVF和标量函数

    阅读导航 1. TVF(表-值行数Table-Valued Functions)         a. 创建TVF         b. 使用TVF的低性能T-SQL         c. 使用临时表 ...

  4. jar tvf study.war jar命令查看war/jar包的内容

    jar tvf study.war 0 Thu Oct 20 14:01:18 CST 2016 META-INF/ 137 Thu Oct 20 14:01:16 CST 2016 META-INF ...

  5. [Hive - LanguageManual ] Windowing and Analytics Functions (待)

    LanguageManual WindowingAndAnalytics     Skip to end of metadata   Added by Lefty Leverenz, last edi ...

  6. pyglet: a cross-platform windowing and multimedia

    pyglet pyglet: a cross-platform windowing and multimedia library for Python.

  7. SQL Fundamentals: 子查询 || 分析函数(PARTITION BY,ORDER BY, WINDOWING)

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  8. Storm API,Tutorial,Trident,Windowing BOOKS

    http://storm.apache.org/releases/1.0.0/Trident-API-Overview.html https://stackoverflow.com/questions ...

  9. 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...

随机推荐

  1. bbs项目解读

    1.注册功能 具体的效果图如下: 注册功能涉及到的逻辑步骤: 1.搭建前端html页面 2.向后端提交用户输入数据 3.对用户输入的数据格式进行校验 4.页面输入数据格式错误,及时向用户进行提示/正确 ...

  2. pod资源的健康检查-readiness探针的httpGet使用

    livenessProbe:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器 readinessProbe:可用性检查,周期性检查服务是否可用,不可用将从service的endpoint ...

  3. spring项目中starter包的原理,以及自定义starter包的使用

    MAVEN项目中starter的原理 一.原始方式 我们最早配置spring应用的时候,必须要经历的步骤:1.pom文件中引入相关的jar包,包括spring,redis,jdbc等等 2.通过pro ...

  4. v-if和v-for的优先级是什么?

    一.作用 v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回 true值的时候被渲染 v-for 指令基于一个数组来渲染一个列表.v-for 指令需要使用 item in item ...

  5. 【Git进阶】基于文件(夹)拆分大PR

    背景 前段时间为了迁移一个旧服务到新项目,由此产生了一个巨大的PR,为了方便Code Review,最终基于文件夹,将其拆分成了多个较小的PR:现在这里记录下,后面可能还会需要. 演示 为了方便演示, ...

  6. CSS之垂直水平居中的背后

    最开始,我想说,这个体系有点大,我写的并不好.就当作是一个思路吧,虽然这个思路有点乱.几乎每一个实现方案的背后都是该属性及其组合的原理,每一个都要剖析其规范细节的话,这篇文章绝不会是这样的篇幅,所以每 ...

  7. 《Java基础——继承》

    Java基础--继承     一.类的继承: 规则: 1.一个子类只能有一个父类,但一个父类可以有多个子类,每个子类都可以作为父类使用. 2.若一个类没有声明父类,则默认其父类为Object. 3.父 ...

  8. C语言大作业---学生信息管理系统

    xxxx信息管理系统 简介 因为大作业规定的踩分项就那么多,为了不浪费时间 + 得分,就写成这样.现在看看,命名不规范,书写风格糟糕,全塞在一个源代码中······ 不过,应付大作业是没问题的 实验报 ...

  9. Kubernetes实践技巧:Windows 系统最佳实践

    有部分同学是使用的 Windows 系统,我们的直播课程也是在 Windows 系统下面进行的,然后通过 SSH 方式连接到 服务器上面操作 Kubernetes,由于对 vim 不是很熟悉,所以又通 ...

  10. ProxySQL(10):读写分离方法论

    文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9318558.html 不同类型的读写分离 数据库中间件最基本的功能就是实现读写分离,ProxySQL当然也支 ...