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时间,范围查询用东八区时间就没有问题。
相关推荐
Elastic 中国社区官方博客11 小时前
如何比较两个 Elasticsearch 索引并找出缺失的文档
大数据·运维·数据库·elasticsearch·搜索引擎
阿里云大数据AI技术15 小时前
Elasticsearch 智能助手:Agent 让运维从经验驱动迈向智能协同
人工智能·elasticsearch·agent
贾天佑忆月1 天前
Mac 本地项目推送至 GitHub 完整指南
elasticsearch·macos·github
望江东浪1 天前
我的 Claude Code 效率工具全套配置分享
大数据·elasticsearch·搜索引擎
Elasticsearch2 天前
如何使用 OpenTelemetry 在 Elastic 上构建搜索分析,无需额外的管道
elasticsearch
Elasticsearch2 天前
用于 Kubernetes 监测的常用 ES|QL 查询
elasticsearch
本旺2 天前
Flink 2.x状态演进:理解解 1.x 与 2.x 状态存储机制
大数据·flink
Apache Flink2 天前
从结构化到多模态:Apache Flink,多模态数据处理的流式底座
大数据·flink·apache
婉然从物2 天前
Flink SQL 元数据持久化实战:从“每次重启表消失”到“Hive Metastore 永久存储”
hive·sql·flink
本旺2 天前
Elasticsearch 前缀匹配性能优化实战,附4种方式即执行计划判别
大数据·elasticsearch·性能优化