数据漂移如何解决?

什么是数据漂移?

通常是指 ods 表的同一个业务日期数据中包含了前一天或后一天凌晨附近的数据或者丢失当天变更的数据,这种现象就叫做漂移,且在大部分公司中都会遇到的场景。

如何解决数据漂移问题?

通常有两种解决方案:

  1. 多获取后一天的数据,保障数据只多不少
  2. 通过多个时间戳字段来限制时间获取相对准确的数据

第一种方案比较暴力,这里不做过多解释,主要来讲解一下第二种解决方案。(首先这种解决方案在大数据之路这本书有体现)。
第一种方案里,时间戳字段分为四类:

1. 数据库表中用来标识数据记录更新时间的时间戳字段(假设这类字段叫modifiedtime)。

2. 数据库日志中用来标识数据记录更新时间的时间戳字段·(假设这类宇段叫log_time)。

3. 数据库表中用来记录具体业务过程发生时间的时间戳字段(假设这类字段叫proc_time)。

4. 标识数据记录被抽取到时间的时间戳字段(假设这类字段extracttime)。

理论上这几个时间应该是一致的,但往往会出现差异,造成的原因可能为

1. 数据抽取需要一定的时间,extract_time往往晚于前三个时间。
2. 业务系统手动改动数据并未更新modfied_time。
3. 网络或系统压力问题,log_time或modified_time晚于proc_time。

通常都是根据以上的某几个字段来切分ODS表,这就产生了数据漂移。具体场景如下

  1. 根据extract_time进行同步。
    根据modified_time进行限制同步,在实际生产中这种情况最常⻅,但是往往会发生不更新modifiedtime
  2. 而导致的数据遗漏,或者凌晨时间产生的数据记录漂移到后天 。由于网络或者系统压力问题, log_time 会晚proc_time ,从而导致凌晨时间产生的数据记录漂移到后一天。
  3. 根据proc_time来限制,会违背ods和业务库保持一致的原则,因为仅仅根据proc_time来限制,会遗漏很多其他过程的变化。

第二种解决方案

  1. 首先通过log_time多同步前一天最后15分钟和后一天凌晨开始15分钟的数据,然后用modified_time过滤非 当天的数据,这样确保数据不会因为系统问题被遗漏。
  2. 然后根据log_time获取后一天15分钟的数据,基于这部分数据,按照主键根据log_time做升序排序,那么第 一条数据也就是最接近当天记录变化的。
  3. 最后将前两步的数据做全外连接,通过限制业务时间proc_time来获取想要的数据。

回复

共1条回复 我来回复
  • 迷失技术de小猪
    迷失技术de小猪
    稍等伙伴们,思考简介中~
    评论

    什么是数据漂移?

    通常是指 ods 表的同一个业务日期数据中包含了前一天或后一天凌晨附近的数据或者丢失当天变更的数据,这种现象就叫做漂移,且在大部分公司中都会遇到的场景。

    如何解决数据漂移问题?

    通常有两种解决方案:

    1. 多获取后一天的数据,保障数据只多不少
    2. 通过多个时间戳字段来限制时间获取相对准确的数据

    第一种方案比较暴力,这里不做过多解释,主要来讲解一下第二种解决方案。(首先这种解决方案在大数据之路这本书有体现)。
    第一种方案里,时间戳字段分为四类:

    1. 数据库表中用来标识数据记录更新时间的时间戳字段(假设这类字段叫modifiedtime)。

    2. 数据库日志中用来标识数据记录更新时间的时间戳字段·(假设这类宇段叫log_time)。

    3. 数据库表中用来记录具体业务过程发生时间的时间戳字段(假设这类字段叫proc_time)。

    4. 标识数据记录被抽取到时间的时间戳字段(假设这类字段extracttime)。

    理论上这几个时间应该是一致的,但往往会出现差异,造成的原因可能为

    1. 数据抽取需要一定的时间,extract_time往往晚于前三个时间。
    2. 业务系统手动改动数据并未更新modfied_time。
    3. 网络或系统压力问题,log_time或modified_time晚于proc_time。

    通常都是根据以上的某几个字段来切分ODS表,这就产生了数据漂移。具体场景如下

    1. 根据extract_time进行同步。
      根据modified_time进行限制同步,在实际生产中这种情况最常⻅,但是往往会发生不更新modifiedtime
    2. 而导致的数据遗漏,或者凌晨时间产生的数据记录漂移到后天 。由于网络或者系统压力问题, log_time 会晚proc_time ,从而导致凌晨时间产生的数据记录漂移到后一天。
    3. 根据proc_time来限制,会违背ods和业务库保持一致的原则,因为仅仅根据proc_time来限制,会遗漏很多其他过程的变化。

    第二种解决方案

    1. 首先通过log_time多同步前一天最后15分钟和后一天凌晨开始15分钟的数据,然后用modified_time过滤非 当天的数据,这样确保数据不会因为系统问题被遗漏。
    2. 然后根据log_time获取后一天15分钟的数据,基于这部分数据,按照主键根据log_time做升序排序,那么第 一条数据也就是最接近当天记录变化的。
    3. 最后将前两步的数据做全外连接,通过限制业务时间proc_time来获取想要的数据。
    1个月前 0条评论
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载