0


flinksql 中使用 处理时间时, 时区差八个小时的问题 (在 flink 1.13 以后不会在出现时区问题了)

原因:

    使用事件时间进行开窗时,需要事件进行触发,比如开一个小时的窗口,在 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`,
标签: flink 大数据

本文转载自: https://blog.csdn.net/zuixue_lei/article/details/127909333
版权归原作者 fyl005 所有, 如有侵权,请联系我们删除。

“flinksql 中使用 处理时间时, 时区差八个小时的问题 (在 flink 1.13 以后不会在出现时区问题了)”的评论:

还没有评论