wordpress怎么上传网站,wordpress 短信,做seo排名好的网站,免费友情链接交换平台#xff08;1#xff09;概述
时间属性#xff08;time attributes#xff09;#xff0c;其实就是每个表模式结构#xff08;schema#xff09;的一部分。它可以在创建表的 DDL 里直接定义为一个字段#xff0c;也可以在 DataStream 转换成表时定义。
一旦定义了时间…1概述
时间属性time attributes其实就是每个表模式结构schema的一部分。它可以在创建表的 DDL 里直接定义为一个字段也可以在 DataStream 转换成表时定义。
一旦定义了时间属性它就可以作为一个普通字段引用并且可以在基于时间的操作中使用。
时间属性的数据类型为 TIMESTAMP它的行为类似于常规时间戳可以直接访问并且进行计算。
按照时间语义的不同可以把时间属性的定义分成事件时间event time和处理时间processing time两种情况。
2事件时间
1在创建表的 DDL 中定义
在创建表的 DDLCREATE TABLE 语句中可以增加一个字段通过 WATERMARK语句来定义事件时间属性。
WATERMARK 语句主要用来定义水位线watermark的生成表达式这个表达式会将带有事件时间戳的字段标记为事件时间属性并在它基础上给出水位线的延迟时间。
具体定义方式如下
CREATE TABLE EventTable(user STRING,url STRING,ts TIMESTAMP(3),WATERMARK FOR ts AS ts - INTERVAL 5 SECOND
) WITH (...
);把 ts 字段定义为事件时间属性而且基于 ts 设置了 5 秒的水位线延迟。这里的“5 秒”是以“时间间隔”的形式定义的格式是 INTERVAL 数值 时间单位INTERVAL 5’ SECOND这里的数值必须用单引号引起来而单位用 SECOND 和 SECONDS 是等效的。
Flink 中支持的事件时间属性数据类型必须为 TIMESTAMP 或者 TIMESTAMP_LTZ。这里TIMESTAMP_LTZ 是指带有本地时区信息的时间戳TIMESTAMP WITH LOCAL TIME ZONE
如数据中的时间戳是“年-月-日-时-分-秒”形式那就是不带时区信息的可以将事件时间属性定义为 TIMESTAMP 类型。 而如果原始的时间戳就是一个长整型的毫秒数这时就需要另外定义一个字段来表示事件时间属性类型定义为 TIMESTAMP_LTZ 会更方便
CREATE TABLE events (user STRING,url STRING,ts BIGINT,ts_ltz AS TO_TIMESTAMP_LTZ(ts, 3),WATERMARK FOR ts_ltz AS ts_ltz - INTERVAL 5 SECOND
) WITH (...
);这里我们另外定义了一个字段 ts_ltz是把长整型的 ts 转换为 TIMESTAMP_LTZ 得到的进而使用 WATERMARK 语句将它设为事件时间属性并设置 5 秒的水位线延迟。
2在数据流转换为表时定义
调用 fromDataStream()方法创建表时可以追加参数来定义表中的字段结构这时可以给某个字段加上.rowtime() 后缀就表示将当前字段指定为事件时间属性。
这个字段可以是数据中本不存在、额外追加上去的“逻辑字段”就像之前 DDL 中定义的第二种情况也可以是本身固有的字段那么这个字段就会被事件时间属性所覆盖类型也会被转换为 TIMESTAMP。
不论哪种方式时间属性字段中保存的都是事件的时间戳TIMESTAMP 类型。
需要注意的是这种方式只负责指定时间属性而时间戳的提取和水位线的生成应该之前就在 DataStream 上定义好了。
由于 DataStream 中没有时区概念因此 Flink 会将事件时间属性解析成不带时区的 TIMESTAMP 类型所有的时间值都被当作 UTC 标准时间。
在代码中的定义方式如下
// 方法一:
// 流中数据类型为二元组 Tuple2包含两个字段需要自定义提取时间戳并生成水位线
DataStreamTuple2String, String stream inputStream.assignTimestampsAndWatermarks(...);// 声明一个额外的逻辑字段作为事件时间属性
Table table tEnv.fromDataStream(stream, $(user), $(url),$(ts).rowtime());// 方法二:
// 流中数据类型为三元组 Tuple3最后一个字段就是事件时间戳
DataStreamTuple3String, String, Long stream inputStream.assignTimestampsAndWatermarks(...);// 不再声明额外字段直接用最后一个字段作为事件时间属性
Table table tEnv.fromDataStream(stream, $(user), $(url),$(ts).rowtime());3处理时间
系统时间使用时不需要提取时间戳timestamp和生成水位线watermark。因此在定义处理时间属性时必须要额外声明一个字段专门用来保存当前的处理时间。
类似地处理时间属性的定义也有两种方式创建表 DDL 中定义或者在数据流转换成表时定义。
1在创建表的 DDL 中定义
在创建表的 DDLCREATE TABLE 语句中可以增加一个额外的字段通过调用系统内置的 PROCTIME()函数来指定当前的处理时间属性返回的类型是 TIMESTAMP_LTZ。
CREATE TABLE EventTable(user STRING,url STRING,ts AS PROCTIME()
) WITH (...
);时间属性以“计算列”computed column的形式定义出来的。所谓的计算列是 Flink SQL 中引入的特殊概念可以用一个 AS 语句来在表中产生数据中不存在的列并且可以利用原有的列、各种运算符及内置函数。
在前面事件时间属性的定义中将 ts 字段转换成 TIMESTAMP_LTZ 类型的 ts_ltz也是计算列的定义方式。
2在数据流转换为表时定义
处理时间属性同样可以在将 DataStream 转换为表的时候来定义。我们调用 fromDataStream()方法创建表时可以用.proctime()后缀来指定处理时间属性字段。
由于处理时间是系统时间原始数据中并没有这个字段所以处理时间属性一定不能定义在一个已有字段上只能定义在表结构所有字段的最后作为额外的逻辑字段出现。
代码中定义处理时间属性的方法如下
DataStreamTuple2String, String stream ...;// 声明一个额外的字段作为处理时间属性字段
Table table tEnv.fromDataStream(stream, $(user), $(url),$(ts).proctime());4窗口Window
1分组窗口Group Window老版本
在 Flink 1.12 之前的版本中Table API 和 SQL 提供了一组“分组窗口”Group Window函数常用的时间窗口如滚动窗口、滑动窗口、会话窗口都有对应的实现具体在 SQL 中就是调用 TUMBLE()、HOP()、SESSION()传入时间属性字段、窗口大小等参数就可以了。
以滚动窗口为例
TUMBLE(ts, INTERVAL 1 HOUR)这里的 ts 是定义好的时间属性字段窗口大小用“时间间隔”INTERVAL 来定义。在进行窗口计算时分组窗口是将窗口本身当作一个字段对数据进行分组的可以对组内的数据进行聚合。
基本使用方式如下
Table result tableEnv.sqlQuery(SELECT user,
TUMBLE_END(ts, INTERVAL 1 HOUR) as endT, COUNT(url) AS cnt FROM EventTable GROUP BY // 使用窗口和用户名进行分组user, TUMBLE(ts, INTERVAL 1 HOUR) // 定义 1 小时滚动窗口);这里定义了 1 小时的滚动窗口将窗口和用户 user 一起作为分组的字段。用聚合函数COUNT()对分组数据的个数进行了聚合统计并将结果字段重命名为cnt用TUPMBLE_END() 函数获取滚动窗口的结束时间重命名为 endT 提取出来。
分组窗口的功能比较有限只支持窗口聚合所以目前已经处于弃用deprecated的状态。
2窗口表值函数Windowing TVFs新版本
从 1.13 版本开始Flink 开始使用窗口表值函数Windowing table-valued functionsWindowing TVFs来定义窗口。
窗口表值函数是 Flink 定义的多态表函数PTF可以将表进行扩展后返回。表函数table function可以看作是返回一个表的函数。
目前 Flink 提供了以下几个窗口 TVF 1.滚动窗口Tumbling Windows 2.滑动窗口Hop Windows跳跃窗口 3.累积窗口Cumulate Windows 4.会话窗口Session Windows目前尚未完全支持。
1.概述
窗口表值函数可以完全替代传统的分组窗口函数。窗口 TVF 更符合 SQL 标准性能得到了优化拥有更强大的功能可以支持基于窗口的复杂计算例如窗口 Top-N、窗口联结window join等等。
在窗口 TVF 的返回值中除去原始表中的所有列还增加了用来描述窗口的额外 3 个列“窗口起始点window_start、“窗口结束点”window_end、“窗口时间”window_time。
起始点和结束点比较好理解这里的“窗口时间”指的是窗口中的时间属性它的值等于 window_end - 1ms所以相当于是窗口中能够包含数据的最大时间戳。
在 SQL 中的声明方式与以前的分组窗口是类似的直接调用 TUMBLE()、HOP()、CUMULATE()就可以实现滚动、滑动和累积窗口不过传入的参数会有所不同。
2.滚动窗口TUMBLE
滚动窗口在 SQL 中的概念与 DataStream API 中的定义完全一样是长度固定、时间对齐、无重叠的窗口一般用于周期性的统计计算。
在 SQL 中通过调用 TUMBLE()函数就可以声明一个滚动窗口只有一个核心参数就是窗口大小size。
在 SQL 中不考虑计数窗口所以滚动窗口就是滚动时间窗口参数中还需要将当前的时间属性字段传入另外窗口 TVF 本质上是表函数可以对表进行扩展所以还应该把当前查询的表作为参数整体传入。具体声明如下
TUMBLE(TABLE EventTable, DESCRIPTOR(ts), INTERVAL 1 HOUR)这里基于时间字段 ts对表 EventTable 中的数据开了大小为 1 小时的滚动窗口。窗口会将表中的每一行数据按照它们 ts 的值分配到一个指定的窗口中。
2滑动窗口HOP
滑动窗口的使用与滚动窗口类似可以通过设置滑动步长来控制统计输出的频率。在 SQL中通过调用 HOP()来声明滑动窗口除了也要传入表名、时间属性外还需要传入窗口大小size和滑动步长slide两个参数。
HOP(TABLE EventTable, DESCRIPTOR(ts), INTERVAL 5 MINUTES, INTERVAL 1 HOURS));这里我们基于时间属性 ts在表 EventTable 上创建了大小为 1 小时的滑动窗口每 5 分钟滑动一次。需要注意的是紧跟在时间属性字段后面的第三个参数是步长slide第四个参数才是窗口大小size。
3累积窗口CUMULATE
滚动窗口和滑动窗口可以用来计算大多数周期性的统计指标。
在实际应用中还会遇到这样一类需求我们的统计周期可能较长因此希望中间每隔一段时间就输出一次当前的统计值
与滑动窗口不同的是在一个统计周期内我们会多次输出统计值它们应该是不断叠加累积的。
例如我们按天来统计网站的 PVPage View页面浏览量如果用 1 天的滚动窗口那需要到每天 24 点才会计算一次输出频率太低如果用滑动窗口计算频率可以更高但统计的就变成了“过去 24 小时的 PV”。
所以我们真正希望的是还是按照自然日统计每天的PV不过需要每隔 1 小时就输出一次当天到目前为止的 PV 值。这种特殊的窗口就叫作“累积窗口”Cumulate Window。 累积窗口是窗口 TVF 中新增的窗口功能它会在一定的统计周期内进行累积计算。
累积窗口中有两个核心的参数最大窗口长度max window size和累积步长step。
所谓的最大窗口长度其实就是我们所说的“统计周期”最终目的就是统计这段时间内的数据。开始时创建的第一个窗口大小就是步长 step之后的每个窗口都会在之前的基础上再扩展 step 的长度直到达到最大窗口长度。
在 SQL 中可以用 CUMULATE()函数来定义具体如下
CUMULATE(TABLE EventTable, DESCRIPTOR(ts), INTERVAL 1 HOURS, INTERVAL 1 DAYS))这里我们基于时间属性 ts在表 EventTable 上定义了一个统计周期为 1 天、累积步长为 1小时的累积窗口。注意第三个参数为步长 step第四个参数则是最大窗口长度。
上面所有的语句只是定义了窗口类似于 DataStream API 中的窗口分配器在 SQL 中窗口的完整调用还需要配合聚合操作和其它操作。