1 背景
若数据库中有一张表,每天都会新增数据,这时候用户可以使用 增量抽取,只将每天新增的数据更新到 Smartbi MPP 表,这样就不需要更新整张数据表,节省了更新时间和更新资源。
1、增量抽取只在数据模型引擎V2.0上生效。
2、目前增量抽取支持的缓存库:SmartbiMpp产品默认使用高速缓存库CH、StarRocks、SmartbiMppMD产品exe安装包自带高速缓存库,正在持续继续完善。
4、增量抽取是针对数据模型的单个表或查询进行设置的。
1.1 增量抽取适用场景
增量抽取常用于频繁更新且数据量比较大的表。
满足以下条件的数据表,比较适合使用增量抽取:
- 历史数据不会变动 --入库方式可以使用”追加“。
- 表内有“时间戳”字段,可用来和"更新时间"做对比实现增量更新,--入库方式可以使用”更新与插入“。
2 示例介绍
2.1 增量数据入库方式-追加示例
- 追加适合的场景:历史数据不会变动 的情况。
- 追加:每次抽取,根据“用于标识新增数据的字段”判断数据库中的数据是否为新增数据,对数据库的新增数据进行抽取,并追加在MPP数据库中,如下图所示:
以产品自带数据源northwind数据库下的“orderDetails”表,”produts“表进行为例进行说明。
1、创建数据模型并在数据模型加入"orderDetails"表、”produts“表,创建的模型如下:
2、由于”orderDetails“表的数据每天都会增加,在”orderDetails“表上设置增量抽取:
增量数据获取方式:
- 按字段筛选:当选中的是”数据源表“时,它才是启用状态,当选中的是其他查询是禁用状态。
- 按参数筛选:当选中的是SQL查询、存储过程查询、java查询、可视化SQL查询、脚本查询,它是启用状态;当选中”数据源表“时,它是禁用状态
当前”orderDetails“表是数据源表的类型,所以”增量数据获取方式“是”按字段筛选“,需要选择”用于标识新增数据的字段“:
- 代表的意思:假设“用于标识新增数据的字段”是 field,上一次抽取时 field 字段的最大值表示为 last_max(field),则本次抽取获取增量数据的过滤条件是 field > last_max(field)。
- 只能选择整型、日期、日期时间类型的字段。
- 只能选择一个字段。当前场景选择”OrderID“字段:。
增量入库方式:支持追加、更新与插入;选择追加。
3、配置好之后,点击【确定】,保存数据模型之后,点击增量抽取页面的”立即抽取“,查看抽取日志,可以看到第一次是全量抽取:
4、去数据库中在“orderDetails” 表中增加几条数据:
5、再次点击【立即抽取】,可以看到“orderDetails”已追加了新的数据。
2.2 增量数据入库方式-更新与插入示例
- 更新与插入的使用场景:数据量较大,历史数据会进行变更。并且表内有“时间戳”字段,可用来和"更新时间"做对比实现增量更新。
- 更新与插入:每次抽取,根据“用于判断数据在缓存库中是否存在的主键字段”逐行判断该行数据在缓存库中是否存在,如果不存在则插入,如果存在则更新,如下图所示:
前提条件
要实现增量抽取的“更新与插入”,必须满足两个条件:
1、必须指定主键。
2、必须指定更新时间: 数据库中源表必须要有数据的更新时间,如果更新时间为空或null,更新与插入会失败。
以产品自带数据源northwind数据库下的“orders”表、“OrderDetail”为例来进行说明。
为了更好的说明增量抽取的原理,在"orders"源表中,增加一列“UpdateTime”,如下图:
具体的操作步骤如下:
1、创建数据模型并在数据模型加入"ordersDetail"表,以及通过SQL查询来筛选大于2024-01-01的“Orders”表信息,创建的模型如下:
2、在参数管理中,创建参数UpdateTime,并映射到“Orders”表:
3、由于"Orders"表的数据很大,并且经常会更新,抽取方式选择“增量抽取”。
增量数据获取方式: SQL查询 类型默认是”按参数筛选“,”按参数筛选“需要填写”用于标识新增数据的参数“、”与参数关联的字段“。
由于刚已经映射了参数“UpdateTime”,所以“用于标识新增数据的参数” 选择“UpdateTime”、”与参数关联的字段“的选择“UpdateTime”字段, 如下图所示:
选项1 | 选项2 | 说明 |
---|---|---|
按参数筛选 | 用于标识新增数据的参数 |
|
与参数关联的字段 | 只能选择数值型、日期、日期时间类型的字段。 | |
增量数据入库方式 | 追加 | 原理:本次抽取的增量数据,全部追加到缓存库中。 |
更新与插入 | 原理:本次抽取的增量数据,利用“主键字段”逐行判断该行数据在缓存库中是否存在,如果不存在则插入,如果存在则更新。 ”用于判断数据在缓存库中是否存在的主键字段“ 选项:
| |
立即抽取 | 如果是第一次抽取,则会把整个模型都执行全量抽取,如果非第一次抽取,则会根据上一次抽取时UpdateTime字段的最大值为参数默认值进行抽取。 | |
立即覆盖抽取 | 即全量抽取,如果其他表/查询没有更改过,只会抽取该表的数据;如果其他表/查询调整了结构也会把调整结构的表都抽取了。 |
4、配置好之后,去抽取数据模型,查看抽取日志,如果是第一次抽取,默认是全量抽取:
5、去源数据库中在该表新增以及更改几条数据:
6、再次点击【立即抽取】按钮,抽取成功之后,查看日志,可以看到是增量抽取:
注意:增量更新时,如果与之关联的是事实表,系统会自动更新相关联的事实表中的小宽表。如果关联的事实表数据量较大,抽取时间可能会相对较长。
7、去创建即席查询,可以查看到刚新增与更新的记录:
如果已抽取2024-10-29的数据了,源库又更新了“2024-10-29”的数据,再点击抽取,是没办法把"2024-10-29"的数据增量过来的;这时候需要全量抽取。
原因:更新参数的默认值已记住了2024-10-29,SQL语句是UpdateTime >’2024-10-29‘,所以没办法更新与插入同一天的数据。
3 注意事项
目前增量抽取还没有支持的场景:覆盖多少天/季度等,即每次抽取,根据日期及滚动周期将数据库中新增以及部分历史数据抽取到MPP数据库中,其中历史数据将会覆盖原数据。
4 数据抽取耗时对比
硬件配置: 内存8G,CPU8核;测试数据库: MySQL 8.0
数据模型如下图:
4.1【orders】入库方式"追加"
场景1:在[orders]表中,初始数据量为1000w,分别增量“追加”100w、500w性能情况:
表名称 | 原始数据 | 列数 | 全量抽取耗时 | 增量数据 | 增量抽取耗时 | 抽取提升效率 |
orders | 1kw | 25 | 263s | 100w | 98s | 2.7倍 |
500W | 186s | 1.4倍 | ||||
customers | 200w | 14 | 97s |
场景2:在[orders]表中,初始数据量为1亿,分别增量”追加“100w、500w性能情况:
表名称 | 原始数据 | 列数 | 全量抽取耗时 | 增量数据 | 增量抽取耗时 | 抽取提升效率 |
orders | 1亿 | 25 | 2084s | 100w | 434s | 4.8倍 |
500W | 584s | 3.5倍 | ||||
customers | 200w | 14 | 97s |
4.2【orders】入库方式"更新与插入"
场景1:在[orders]表中,初始数据量为1000w,分别增量”更新与插入“100w、500w性能情况:
表名称 | 原始数据 | 列数 | 全量抽取耗时 | 增量数据 | 增量抽取耗时 | 抽取提升效率 |
orders | 1kw | 25 | 263s | 100w | 140s | 1.9倍 |
500W | 234s | 1.1倍 | ||||
customers | 200w | 14 | 97s |
场景2:在[orders]表中,初始数据量为1亿,分别增量”更新与插入“100w、500w性能情况:
表名称 | 原始数据 | 列数 | 全量抽取耗时 | 增量数据 | 增量抽取耗时 | 抽取提升效率 |
orders | 1亿 | 25 | 2084s | 100w | 740s | 2.8倍 |
500W | 904s | 2.3倍 | ||||
customers | 200w | 14 | 97s |
问题1: 我的原始数据是3000w,每天增量10w,列数:60列,抽取大概需要多久?
答:是一千万的三倍,但是抽取时间是会比3倍少,全量大概10分钟, 增量抽取耗时大概90s。
问题2:我的机器配置是:X86架构 32核; 内存 128G,硬盘1TB+。 如果要实现 "5.1.1 "、"5.1.2"章节的场景,抽取时间大概是多少?
答:此配置远比上面测试环境高,那么抽取耗时也会比上述测试数据低一些。