Flink同步到ES时间遇到的问题

背景

  • 使用Flink SQL把MySQL的数据同步到ES,MySQL的时间是东八区时间,同步到Elasticsearch,发现时间总是有问题。

问题

  • 1、查询出来的时间总是+8小时。

解决方案:项目中jackson配置会把UTC时间转换,所以在存入时间就-8小时转成UTC时间就没毛病。

  • 2、时间范围查询出来的数据不准。

解决方案:存入的时间有转换,范围查询要设置timeZone,否则查询不准。

附录

返回数据使用jackson验证过程

  • 范围查询核心代码
java 复制代码
  // 创建时间范围查询
   if (ObjectUtil.isNotEmpty(request.getCreateTimeStart()) || ObjectUtil.isNotEmpty(request.getCreateTimeEnd())) {
        RangeQueryBuilder createTimeRange = QueryBuilders.rangeQuery("createTime");
        // 指定时区
        createTimeRange.timeZone("GMT+8");
        if (ObjectUtil.isNotEmpty(request.getCreateTimeStart())) {
            createTimeRange.gte(cn.hutool.core.date.DateUtil.format(request.getCreateTimeStart(), "yyyy-MM-dd HH:mm:ss"));
        }
        if (ObjectUtil.isNotEmpty(request.getCreateTimeEnd())) {
            createTimeRange.lte(cn.hutool.core.date.DateUtil.format(request.getCreateTimeEnd(), "yyyy-MM-dd HH:mm:ss"));
        }
        mainQuery.filter(createTimeRange);
    }
  • 同步时转为UTC时间
sql 复制代码
TO_TIMESTAMP(DATE_FORMAT(res.createTime - INTERVAL '8' HOUR, 'yyyy-MM-dd HH:mm:ss')) as createTime
  • 增加配置
yml 复制代码
  jackson:
    locale: zh_CN
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
  • 会使用jackson的配置转换时间

小结

  • 理解Elasticsearch 内部固定使用 UTC 时间存储所有日期类型字段。实际上这2个问题是时间没对其的缘故,存入数据转成UTC时间,范围查询用东八区时间就没有问题。
相关推荐
starzy199044 分钟前
Flink高级之富函数类深度剖析:执行时序、状态注册与序列化陷阱
大数据·flink
Elastic 中国社区官方博客19 小时前
Elasticsearch 向量数据库:几分钟内完成部署,以经济高效的方式扩展至数千亿规模
大数据·运维·数据库·elasticsearch·搜索引擎·ai·全文检索
starzy199020 小时前
Flink基础之Transformation API详解及代码实现:从map到connect
大数据·flink
onthe_wing1 天前
flink窗口与水位线详解
大数据·flink
Elasticsearch1 天前
将 Vercel 数据导入 Elastic:无需安装任何东西的无服务器可观测性
elasticsearch
Elastic 中国社区官方博客2 天前
Elasticsearch Python DSL 客户端开发
大数据·数据库·python·elasticsearch·搜索引擎·全文检索
阿里云大数据AI技术2 天前
Al Search x ES Agent Builder:让数据活起来,从搜索走向行动
人工智能·elasticsearch·agent
Elasticsearch2 天前
Elastic Agent Builder 中能够引用证据的 AI 根因分析
elasticsearch
考虑考虑2 天前
elasticSearch中的element_type
运维·后端·elasticsearch