1. 概述编辑
1.1 适用场景
若数据库昨天已经做了全量更新,现在只想增加今天一天的数据到数据库,这种情况下用户就可以使用增量更新。以下表比较适合使用增量更新进行更新:
单表总数据量较大,比如百万以上的数据 ;
表内有类似时间戳作用的字段,比如根据时间戳字段与更新时间的对比实现增量更新;
表历史数据修改频率较低;
1.2 功能介绍
增量更新是指对表中新增加、新删除和新修改的数据进行更新,即将数据库中有变化的数据更新到引擎中存储,并保持以前的数据不变动。增量更新分为:增量增加、增量删除、增量修改,其中增量修改为通过增量增加与删除的组合来实现。增量更新只更新有变化的数据,因此其更新效率较全量更新有明显的提高。在BI中的增量更新均是在 单表更新 中实现的。其实现分为三步:
第一步:用 sql 执行 where 语句 uptime >上次更新时间(也可以不用参数“上次更新时间”,可自定义一个),将数据库中更新的时间与上次更新的时间进行对比,当某条数据在数据库里的更新的时间大于上次更新的时间,便说明该数据是未更新的数据,将它们更新进来即可;
第二步:读取到数据库中表的变化。表的变化分为:增加、删除、修改,通过 sql 语句首先识别到数据变化的行,再识别变化的类型是哪一种,从而确定属于哪一种增量更新。实现这一步,数据表要满足表中存在主键(唯一标识)来标识表中的行,同时有字段记录变化的类型。例如对"用户表( A 表)"进行增量更新,用户表的主键是 UserID ;通过对照表( B 表)来记录用户表的变化,用 ID 和 Uptype 分别记录变化所在的行和类型(用 add 表示增加,del 表示删除,upd 表示修改)。此时执行 sql 语句, where A.ID = B.ID 即可找到变化的行,Uptype="add"即找到增量增加的数据。
第三步:将未更新的数据更新到引擎中,对于增量增加、增量删除及增量修改的操作在 BI 的 单表更新 中完成。在单表更新设置界面,选择“首次生成全量,此后增量更新”即进入到增量更新的设置界面。将相应的 sql 语句分别对应写到对应的增量类型的框中,后台自动执行 sql 语句,选择相应变化的所在的行执行增加、删除、修改三种操作。
2. 增量更新界面编辑
1)进入数据准备>业务包>数据表,点击更新信息,选择单表更新,如下图所示:
2)出现单表更新的界面,增量更新的方式包含两种:「增量增加」和「增量删除」,单击可以点击切换增量更新的方式;
包含两个参数:「上次更新时间」与「当前更新时间」;
下方的空框处用于填写执行增量更新的sql语句。如下图所示:
「上次更新时间」与「当前更新时间」均为对比参数,其使用方式是直接单击该参数名即可输入到设置框内,并使用函数将它们从字符串转化为时间类型。
「上次更新时间」表示的是上一次更新开始的时间;
「当前更新时间」是指本次更新的开始时间;
通过两个时间点,将更新的数据圈定到从上次开始更新时到本次更新之间的新数据上,这样每次更新都会以上次的终点为起点进行更新,以保证数据的准确和完整。
注:「当前更新时间」这个参数并不需要强制使用,它是为了防止出现在更新的 sql 语句查询时,出现插入数据的情况,此时就不易判断该数据是否被更新;使用「当前更新时间」作为下限,可以将查询sql语句时的数据插入放到下次的更新中进行更新,不会出现遗漏或重复插入。如没有上述情况,使用「上次更新时间」即可。
注:「增量更新」是以行为单位的,增量增加是对引擎中保存的数据表直接添加行,「增量删除」是直接删除行。
3. 增量增加编辑
增量增加在使用时一般包含两种情况:普通增量增加和时间戳增量增加。
3.1 普通增量增加
普通增量增加为将表中的所有数据增加到当前表,比如获取销售明细表的 SQL :select * from new_salesdetail,表示将new_salesdetail表中所有数据全部增加到已有的表中。 例如数据库中有两个表 A , B ,其数据结构完全一致,比如 2018-1-14 查看,表 A 中存放的是历史全部数据(不包括 2018-1-14 的数据),而 2018-1-14 的所有数据都存放于表 B 中。此时若需要在 FineBI 中使用所有数据,我们可以先将表 A 的数据全部添加到 FineBI 中,到了 2018-1-15 的时候,将表B的所有数据全量增加到 FineBI 分布式存储中。如下图所示:
点击预览,可查看该 SQL 执行的结果,如下图所示:
如果查询的列数与表中列数不符,会出现执行结果缺少字段的信息提示。因此执行 SQL 的查询列数与当前表中应一致。
3.2 时间戳增量增加
时间戳增量增加可使用参数,设置时间满足大于上次更新时间的数据进行更新。具体请查看 增量更新简单示例 。
4. 增量删除编辑
增量删除会根据查询出来的字段名与 FineBI 中存储的字段名自动匹配,根据查询出来的结果进行数据的删除。增量删除一般也包含两种情况:普通增量删除和时间戳增量删除。
注:只要是查询出来的字段名与 Spider 引擎存储中的字段名匹配,就会将这部分的数据进行删除。
4.1 普通增量删除
此时增量删除选项就好像一个删除按钮,我们只需输入查询语句找到需要删除的部分数据即可。
输入的 SQL 比如:
select 1 as 店号 from new_salesdetail,表示将 new_salesdetail 表中店号为 1 的数据删除掉;
select 1 as 店号, 2 as 楼层 from new_salesdetail,表示将 new_salesdetail 表中店号为 1 以及楼层为 2 的数据删除掉;
select 店号 from new_salesdetail where 楼层 in (1,2,3),表示删除楼层是 1,2,3 的数据;
select 店号 from new_salesdetail where 楼层 in (1,2,3) and 店号 in (2,3,4),表示删除楼层是 1,2,3 以及店号是 2,3,4 的数据。
如下图所示:
点击预览即可看到查找到需要删除的部分。
4.2 时间戳增量删除
与增量增加类似,增量删除也可使用参数,设置时间满足大于上次更新时间的数据进行更新。比如将上次更新时间与本次更新时间之间查询出来的字段进行删除。具体请查看 增量更新简单示例 。
SELECT b.UserID from userModify b where b.uptype = 'del' and b.uptime>str_to_date('上次更新时间','%Y-%m-%d %H:%i:%s') and b.uptime < str_to_date('当前更新时间','%Y-%m-%d %H:%i:%s')
注:该示例 str_to_date 函数仅针对 MySQL 数据库,其他数据库需要使用对应函数转换时间格式。
如下图所示:
5. 增量修改编辑
Spider 引擎中没有单表更新中的增量修改项,可以通过增量删除和增量增加进行功能组合来实现增量修改的场景。例如如下两种场景:
场景 1:
每天的增量数据表 A 包含两部分:用户新录入的数据和用户修改过的历史数据。如果想将这种数据增量到引擎中,我们可以先删除表 A 数据,也就是将引擎中已保存的表A的数据全部删除。然后把表 A 的数据全部增加进入引擎中。即将增量数据全部作为新增数据重新写入引擎存储中。
场景 2:
用户可能对历史数据进行增删改的操作,为了保证数据的准确性,我们可以对数据进行一个增量组合。比如用户修改了前三天的数据,我们可以删除前三天的数据,并增量增加前三天+今天的数据,这样可以不用关心用户具体做了什么增删改的操作,全部更新过来。
6. 增量更新时间编辑
增量更新可以设置立即更新或者定时更新,其时间设置与定时更新中一致,可参考 单表更新 。
6.1 定时增量更新
在配置好增量更新的方式以后,可以+定时设置添加定时任务,如下图所示:
在定时更新任务设置的时候更新方式下选择增量更新,如下图所示:
点击确定以后,该新增的任务即为定时增量更新的任务,如下图所示:
6.2 立即增量更新
同样在配置好增量更新方式以后,直接在单表更新界面单击立即更新,选择增量更新,即可立即进行增量更新。如下图所示: