FlinkSql中的时间语义和TTL
创始人
2024-03-03 09:20:39

时间语义

        时间属性(time attributes)其实就是每个表模式结构(schema)的一部分。它可以在创建表的 DDL 里直接定义为一个字段,也可以在 DataStream 转换成表时定义。一旦定义了时间属性,它就可以作为一个普通字段引用,并且可以在基于时间的操作中使用。时间属性的数据类型为 TIMESTAMP,它的行为类似于常规时间戳,可以直接访问并且进行计算。
        按照时间语义的不同,我们可以把时间属性的定义分成事件时间(event time)和处理时
间(processing time)两种情况

事件事件

        事件时间语义最大的用途就是处理乱序事件或者延迟事件的场景。我们通过设置水位线
(watermark)来表示事件时间的进展,而水位线可以根据数据的最大时间戳设置一个延迟时
间。这样即使在出现乱序的情况下,对数据的处理也可以获得正确的结果。

在创建表的 DDL 中定义

CREATE TABLE user_actions (user_name STRING,data STRING,url stringuser_action_time TIMESTAMP(3),-- 使⽤下⾯这句来将 user_action_time 声明为事件时间,并且声明 watermark 的生成规则,即 user_action_time 减 5 秒WATERMARK FOR user_action_time AS user_action_time - INTERVAL '5' SECOND,-- 事件时间列的字段类型必须是 TIMESTAMP 或者 TIMESTAMP_LTZ 类型,如果不是需特殊处理--user_action_time AS TO_TIMESTAMP(FROM_UNIXTIME(相应时间字段, 'yyyy-MM-dd HH:mm:ss')), --WATERMARK FOR user_action_time as user_action_time - INTERVAL '5' SECOND,
) WITH (...
);SELECT	 user_name,TUMBLE_START(user_action_time, INTERVAL '10' MINUTE),COUNT(url)
FROM user_actions
GROUP BY user_name,TUMBLE(user_action_time, INTERVAL '10' MINUTE)
;

在数据流转换为表时定义

// 方法一:
// 流中数据类型为二元组 Tuple2,包含两个字段;需要自定义提取时间戳并生成水位线
DataStream> stream = 
inputStream.assignTimestampsAndWatermarks(...);
// 声明一个额外的逻辑字段作为事件时间属性
Table table = tEnv.fromDataStream(stream, $("user"), $("url"), 
$("ts").rowtime());

处理时间

        处理时间就是我们的系统时间,使用时不需要提取时间戳(timestamp)和生成水位线(watermark)。因此在定义处理时间属性时,必须要额外声明一个字段,专门用来保存当前的处理时间。

在创建表的 DDL 中定义

CREATE TABLE user_actions (user_name STRING,data STRING,url string-- 使⽤下⾯这句来将 user_action_time 声明为处理时间proc AS PROCTIME()
) WITH (...
);SELECT	 user_name,HOP(proc, INTERVAL '2' MINUTE, INTERVAL '10' MINUTE),COUNT(url)
FROM user_actions
GROUP BY user_name,HOP(proc, INTERVAL '2' MINUTE, INTERVAL '10' MINUTE)
;

在数据流转换为表时定义

DataStream> stream = ...;
// 声明一个额外的字段作为处理时间属性字段
Table table = tEnv.fromDataStream(stream, $("user"), $("url"), 
$("ts").proctime());

时间语义的作用

基于时间的操作(比如时间窗口),需要定义相关的时间语义和时间数据来源的信息。通过定义好的时间,来确认窗口,对于FlinkSql种窗口的内容可参考博客FlinkSql中的窗口_大大大大肉包的博客-CSDN博客

TTL

        在实际应用中,很多状态会随着时间的推移逐渐增长,如果不加以限制,最终就会导致存储空间的耗尽。一个优化的思路是直接在代码中调用.clear()方法去清除状态,但是有时候我们的逻辑要求不能直接清除。这时就需要配置一个状态的“生存时间”(time-to-live,TTL),当状态在内存中存在的时间超出这个值时,就将它清除

全局设置TTL

//方法1
//环境中配置状态的生存时间(TTL):
TableEnvironment tableEnv = ...
// 获取表环境的配置
TableConfig tableConfig = tableEnv.getConfig();
// 配置状态保持时间
tableConfig.setIdleStateRetention(Duration.ofMinutes(60));//方法2
//可以直接设置配置项 table.exec.state.ttl:
TableEnvironment tableEnv = ...
Configuration configuration = tableEnv.getConfig().getConfiguration();
configuration.setString("table.exec.state.ttl", "60 min");

在局部的方法中设置TTL

    public void open(Configuration parameters) throws Exception {super.open(parameters);StateTtlConfig ttlConfig = StateTtlConfig// 设置超时时间,超过24小时后,就会被清除.newBuilder(Time.hours(24))//当状态写入和创建的时候刷新ttl.setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite).setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired).build();}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...