栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

flink处理天级别的开窗出现时区的问题

flink处理天级别的开窗出现时区的问题

flink处理天级别的开窗出现时区的问题

时区的问题是,在处理数据的时候我们是东八区,要对当前要处理的时间加上8小时,才是符合我们预期的。flink这个没考虑时区问题。

1.时间纪元

所谓的”时间纪元”就是1970年1月1日0时0分0秒,指的是开始的时间。比如Java类代码:

Date date = new Date(0);

System.out.println(date);

打印出来的结果:

Thu Jan 01 08:00:00 CST 1970

也是1970年1月1日,实际上时分秒是0点0分0秒,这里打印出来的时间是8点而非0点,原因是存在系统时间和本地时间的问题,其实系统时间依然是0点,只不过我们的电脑时区设置为东8区,故打印的结果是8点。

只需要将时区设置为GMT+0,即可打印出0点0分0秒

System.setProperty(“user.timezone”,“GMT+0”);

实际上时区问题都是在此时间纪元基础上加/减一定的offset。

2.Flink时间

说java纪元跟本文将的flink时间问题有啥关系呢?

Flink在使用时间的这个概念的时候就是基于时间纪元这个概念的。比如首先,我们的时区是东八区,在我们的视野中UTC-0时间应该加8小时的offset,才是我们看到的时间,所以在使用flink的窗口的时候往往比我们当前的时间少8小时

3.解决办法

flink端不做处理。也即是在读取数据的时候加上8小时的offset。

使用udf等算子给时间戳加上8小时的offset。

public class UTC2Local extends ScalarFunction {

    public Timestamp eval(Timestamp s) {
        long timestamp = s.getTime() + 8 * 60 * 60 * 1000;
        return new Timestamp(timestamp);
    }
}

注册udf

tEnv.registerFunction("utc2local",new UTC2Local());

Table table1 = tEnv.sqlQuery("select count(number),utc2local(TUMBLE_END(proctime, INTERVAL '1' HOUR)) from res group by TUMBLE(proctime, INTERVAL '1' HOUR)");

Flink 天级别窗口中存在的时区问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/758579.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号