1. 概述
我们在建设数据仓库、数据集市的过程中,通常使用 ETL 工具把数据从“源库”抽取到“目标库”。“源库”中的历史数据,通常数据量特别大,比如有几千万甚至数亿条记录,而历史数据通常又不发生变化。在抽取数据的过程中,如果我们选择全量抽取,对于那些根本不会发生变化的历史数据,也抽取一遍,不仅没有任何意义,还要浪费大量的资源和时间。尤其是当有数亿条数据、并且需要进行复杂的数据加工时,很可能要耗费数小时,根本无法满足数据加工的时效性要求。因此,我们可以选择在进行 ETL 抽取的过程中,对数据进行 增量抽取,只抽取发生变化的部分。这样就可以让数据抽取的数据量变少,数据加工的时间变短,从而满足时效性要求。
2. 场景说明
我们在把数据从“源库”抽取到“目标库”的过程中,需要仔细分析要抽取的数据的变化情况。
- 对于很多“维度表”数据,比如产品、机构、客户等,它们可能随时都会发生变化,比如某个属性值改变。而如果源库中又不标识发生变化的时间戳,对于此种情况,我们只能选择全量抽取。
- 但对于很多“事实表”数据,比如订单表、订单明细表,通常只有最近的数据会发生变化。或者此类表中,我们会标记发生变化的那些记录,其表中有一个数据变更的时间戳字段。对于这些情形,我们就可以选择增量抽取了。
下面我们要抽取的数据是这样一张表,“每日主流热销车销售数据”表,其中有一个“销售日期”字段,此表的数据每天更新,但只更新前一日数据,更早的历史数据不会发生变化。下面我们就以此表为例,介绍如何通过 Smartbi “自助ETL/作业流”完成数据的增量抽取。
3. 自助ETL中配置增量抽取
在自助ETL中,要进行数据的增量抽取,需要借助“参数”的帮助,并在数据的“输入”节点上配置数据过滤。详细过程说明如下。
3.1 定义抽取的参数
- 在工具栏上点击”... 查看更多“按钮,然后点击下拉菜单中的”参数管理“菜单项。如果发现”参数管理“菜单项是灰色的,无法点击,先“保存”此ETL,然后再继续操作。
- 在弹出的“参数管理”对话框上,新建一个参数。
- “参数名”,随便取一个,比如“抽取日期”。
- 然后指定“参数类型”、数据“类型”。
- “参数值”,这里指定的参数值,只在ETL开发调试中用得到它。当把ETL发布到正式环境时,则通过作业流把”抽取日期“值传递进来,所以这里的参数值可以随便写一个,方便调试即可。
3.2 在输入节点上配置过滤条件
- 点击工具栏上“添加节点”按钮,从添加节点面板上拖入“关系数据源节点”。
- 进行“关系数据源”节点配置。
- 选择要抽取的“关系数据源表”、“输出字段”。
- 然后配置“过滤条件”。比如将过滤条件写为:销售日期 = ${抽取日期} ,这里“ 销售日期 ”是表中的字段名称,而“ ${抽取日期} “ 则是前面在”参数管理“对话框上定义的参数。
- 配置后点击”运行当前节点“,可以看到自助ETL按照我们配置的参数值,只抽取了对应日期的数据。
3.3 正常配置其他转换节点
- 可以使用自助ETL 中的所有”转换“节点,进行正常的数据加工处理。
3.4 数据输出节点配置
- 选择一个合适的”输出“节点。比如我们通常使用”追加到关系表“,把新增数据追加到表中。
- 正常配置该输出节点。
- 设置”数据源、SCHEMA、表“,进行输出字段绑定。
- 注意,这里通常必须配置”回退SQL语句“,原因下面详述。比如将回退SQL语句写为:销售日期 = ${抽取日期} ,这里“ 销售日期 ”是目标表中的字段名称,而“ ${抽取日期} “ 则是前面在”参数管理“对话框上定义的参数。
注意
这里必须配置”回退SQL语句“的原因:
- 我们的ETL 很多时候会重复执行。比如执行过程中报错,我们修复错误后,需要重新执行。或者发现很早以前某天的历史数据错误,需要单独重跑这天的数据。
- 又因为我们选择的是”追加到关系表“节点,从前面节点来的数据都会追加到目标表中,如果某天数据抽取了两次,就会让目标表中数据重复。因此我们通过”回退SQL语句“,先把当前正抽取的这天的数据删除,然后再插入,就避免数据重复的可能性了。
- 背后的执行过程是:先在目标表上执行 DELETE FROM `
table_name`
WHERE `销售日期`
= ${抽取日期} 语句,然后再执行数据插入操作。
4. 作业流中配置增量抽取
接下来我们需要让ETL,每天定时自动运行,自动抽取前一日数据。详细过程说明如下。
4.1 定义系统公共参数
- 为了获取“前一日”这样的动态日期值,我们使用 Smartbi 中的公共参数来做。进入“运维设置 → 全局资源定义 → 参数定义”界面,新建一个“参数”。
- 选择与 ETL 中定义的参数对应的“数据类型”。这里的“控件类型”通常选择“下拉框”,以便返回多个值,用于在作业流中枚举它。
- 定义参数的”备选值“。如果只需要获取“前一日”这样的单个的动态日期值,可以参考下图中的写法。
- 而如果需要获取”最近7日“这样的多个动态日期值,则可以参考下图中的写法。
4.2 配置作业流
- 在作业流中使用”Foreach循环器“节点。它可以对参数备选值进行枚举,然后多次执行被循环的资源。
- 配置”Foreach循环器“节点。类型选择”Foreach参数枚举器“,然后选择前面定义的系统公共参数”抽取数据日期“。
- 然后,”循环资源“选择之前第 3 步中构建的用于增量数据抽取的 ETL。同时对”参数映射“进行设置。
4.3 设置作业流定时运行
- 点击工具栏上的”定时运行“按钮,在弹出的”设置定时作业“对话框上,设置”间隔类型“、”是否启用“、”触发时间“等必要的项目。
此作业流保存后,它就会按照我们设置的时间按时定期执行了。如果我们配置的公共参数,它返回的备选值是多个,则枚举这些参数值,然后重复执行对应的ETL。当前被枚举的参数值,会直接传递到ETL中,替换原来在ETL的”参数管理“界面上定义的参数的默认值。
如此,就完成了我们所希望的对数据进行定时增量抽取的目的了。
5. 交叉引用
在数据挖掘模块中,也会有增量抽取的需求。详情请参考:数据挖掘-参数设置