背景

  最近遇到一个需求,求 Hive 表中每天最新分区的增量数据。首先我们要了解什么是增量数据?通常所说的增量数据,其实更确切的说,应该是变量数据,包括对数据的增加、修改和删除。一般来说,在大数据中 所有的数据是都要保存的,不存在删除数据的可能(当然没有绝对),可能有标记失效数据的标识。

解决方法

  如果表有类似于主键的字段我们可以用主键字段来关联,没有的话可以用类似于联合主键的字段来关联。

with tmp as(
--更新数据和新增数据 uid
    select 
           case when regexp_replace(concat_ws('', a.uid, a.name, a.age, ...), ' ', '') <> regexp_replace(concat_ws('', b.uid, b.name, b.age, ...)
                     then a.uid --更新数据
                when b.uid is null then a.uid --新增数据
                else null
           end AS uid
      from student_info a
 left join student_info b
        on a.uid = b.uid
       and b.dt = '20221009' --前一天分区
     where a.dt = '20221010' --最新分区
)
insert overwrite table table_name_incr (dt = 'xxxx')
--修改数据和新增数据
    select 
           a.uid
           a.name
           a.age
           ...
      from student_info a
      join tmp b
        on a.uid = b.uid
     where a.dt = '20221010' --最新分区
;

上述语句只是找到了增加和修改的数据,删除的数据未找,如果想找的话也可以,代码如下,然后 union all 就行了(其实正常来说是没有删除数据的),代码如下:

select 
           a.uid
           a.name
           a.age
           ...
      from student_info a
 left join student_info b
        on a.uid = b.uid
       and b.dt = '20221010' --最新分区
     where a.dt = '20221009' --前一天分区
     and b.uid is null
;

补充

数据仓库增量数据获取方式解决方案

  我们通常所说的增量数据,其实更确切的说,应该是变量数据,包括对数据的增加、修改和删除。特别是当有些系统存在物理删除数据的情况时,这一点尤为重要。

  从各源系统获取增量数据,是DW/BI类相关应用所必需的环节,那么从源系统获取增量数据的方式究竟有哪些呢?哪些又是我们经常使用的呢?下面我们就来简单介绍介绍:

  这第一种可以是由源系统在数据处理过程当中由应用程序直接记录增量数据,产生增量数据文件。这种做法对源系统的效率会有较大影响,需要改造源系统的应用(植入获取增量数据的程序),所以如果源系统方比较强硬的话不同意植入,甚至源系统与DW系统不是一家单位的那就更无法让你植入了。

  第二种由源系统在日终时按照数据的逻辑规则(如业务日期)识别增量数据,产生增量数据文件。这种做法不影响源系统的日间处理效率,需要开发新的增量数据卸载应用,能够比较有效的识别源系统中的增量数据。这是目前采取的比较多的方式。但是如果存在不经过应用而物理删除数据的情况,则无法识别(日积月累将导致数据仓库出现历史脏数据)

  第三 利用数据库系统的机制,在源系统中增加设置(如trigger,mv,cdc),在日间数据处理过程中由数据库系统识别增量数据,然后再通过应用加工得到增量文件。这种方式对日间处理的效率会有一定的影响,但通常都可以接受,对增量的识别会非常全面,但识别出来的增量数据往往含有大量的过程数据,特别是当同一数据被多次修改时,会产生大量的冗余数据,这是这种方式的一个缺点,需要通过应用加以合并取得该数据的最终状态。这种方式的一个优点,是可以识别出绕过应用直接对数据库所作的修改,包括直接物理删除的内容,这是前一种方式难以做到的。这种方式也是目前比较常见的一种方式,但需要对相关的设置和使用方法非常熟悉。

  第四 数据比对。将源系统当日的数据与昨日的数据进行比较,识别出差异部分作为增量数据,如果需要识别出被物理删除的数据,由于不同的实现方式这种比对可能需要执行两次,一次是找出源系统当日增加和修改了的数据,另一次是找出源系统中当日被删除的数据。这种比对需要首先将源系统的全量数据卸载,然后进行全量数据的比对,效率是一个主要的问题。这种方式据说也有采用,但好像不多。

  第五 数据复制。如果目标数据库与源数据库是同构的,还可以利用数据库系统的复制机制直接获得增量数据并应用到目标数据库中。不同数据库厂商的复制机制不尽相同,对源系统效率的影响通常都可以接受,但复制本身的效率是需要特别关注的,而且还需要考察复制机制下的中断恢复能力。据说目前这种做法在某些领域也有应用。

  第六 依赖RDBMS的日志,对事务数据库的日志文件进行分析,这种办法的成本太高并且要求也比较专业,一般不太适用。