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个小时的问题的,但是不支持,虽然官网上有这个函数)

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

代码实操:

  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,flinkSql,kafka,flink,大数据)