原因:
使用事件时间进行开窗时,需要事件进行触发,比如开一个小时的窗口,在 2:15 分有数据过来,下一条数据在 3:15 分到达,那么窗口将会在 3:15 触发计算,输出 2:00 - 3:00 这个时间段内的统计数据,create_time 也是 3:15 。
很明显这种情况与想要的触发时间不同。
解决:
使用处理时间代替事件时间,不管是否有数据,到达窗口触发时间后都会触发计算的。
**问题:**直接使用处理时间时,会有时区问题(我们有的项目使用的是 Flink 1.12 版本 )。
在 Flink 1.13 之前,PROCTIME() 函数返回类型是 TIMESTAMP,返回值是 UTC 时区的时间戳,例如,上海时间显示为 2021-03-01 12:00:00 时,PROCTIME() 返回值显示 2021-03-01 04:00:00,我们进行使用是错误的。Flink 1.13 修复了这个问题,使用 TIMESTAMP_LTZ 作为 PROCTIME() 的返回类型,这样 Flink 就会自动获取当前时区信息,然后进行处理,不需要用户再进行时区的格式化处理了。
**实操:**把 proctime 的类型转化为 TIMESTAMP_LTZ,可以提交代码,但是运行时报不能识别的错误。(官网上是支持的)
**方案:**
1、使用 处理时间。
2、当用处理时间转化为时间字段时,使用 TIMESTAMPADD 增加 8个小时。(本来想着用LOCALTIMESTAMP 这个函数来处理 相差8个小时的问题的,但是不支持,虽然官网上有这个函数)
代码实操:
1、source 端创表增加处理时间列
`proctime` as PROCTIME(),
2、窗口函数改为使用处理时间
-- 开窗函数使用处理时间
TUMBLE(`proctime`, INTERVAL '1' HOUR ),
3、使用处理时间转化为时间字段时,加 8个小时
-- 时区加 8个小时
date_format_local(TIMESTAMPADD(HOUR, 8, cast(TUMBLE_START(`proctime`, INTERVAL '1' HOUR) as TIMESTAMP)),'yyyyMMddHHmmss') as `state_time`,
date_format_local(TIMESTAMPADD(HOUR, 8, cast(TUMBLE_START(`proctime`, INTERVAL '1' HOUR)as TIMESTAMP)) ,'yyyyMMddHHmmss') as `stat_time_start`,
date_format_local(TIMESTAMPADD(SECOND,-1, TIMESTAMPADD(HOUR, 8, cast(TUMBLE_END(`proctime`, INTERVAL '1' HOUR) as TIMESTAMP)) ),'yyyyMMddHHmmss') as `stat_time_end`,
本文转载自: https://blog.csdn.net/zuixue_lei/article/details/127909333
版权归原作者 fyl005 所有, 如有侵权,请联系我们删除。
版权归原作者 fyl005 所有, 如有侵权,请联系我们删除。