ODS层数据加载策略
F1;F2;F3;F5;F8;I;算法
一.F1算法
F1算法(DELETE/INSERT):全量算法,全删全插。即删除历史表中所有数据;将最新增量加载日表数据全部插入历史表中。
适用场景:一般多用于全量数据,数据量较小,但对于历史情况不许过多关注,只关注最新有效数据情况,比如全国省份信息,企业内部全国机构信息。
二.F2算法
F2算法(UPSERT):增量&全量,更新插入(UPSERT)。
1)根据业务逻辑确定对主键比字段(Upsert by)。
2)生成当前临时表,将当日加载日表数据插入当前临时表。
3)根据当前临时表中数据要素,update历史表(T_PFS_CUS_ACC)中相对应的数据,where条件根据(upsert by)。
4)插入数据,将当前临时表中的数据在历史表中不存在即新增数据(以upsert by为条件)的数据插入到历史表。
逻辑图
适用场景:一般多用于全量数据,数据量相当大,但对于历史情况不许过多关注,只关注最新有效数据情况,比如企业内部所所有客户信息情况。
三.F3算法
F3算法:增量&全量,历史拉链(History Chain):
- 恢复时间戳,即避免同一天多次运行造成数据重复。
1)将历史表中开始日期等于要要加载的日期的数据删除 DELETE FROM histable WHERE 开始日期=当前输入日期(start_dt=$tx_date)。
2)将结束日期等于加载日期的数据,将结束日期更改为最大日期 UPDATE histable SET 结束日期 Sttm_Dt= $MAXDATE WHERE Sttm_Dt= ${TX_DATE}‘; 根据业务逻辑确定对主键比字段(Upsert by)。 - 根据业务逻辑确定对主键比字段(Upsert by);
- 生成当前临时表,将当日加载日表数据插入当前临时表;
- 比较今日数据(即“当前数据临时表”中的数据)和当前有效数据(当前有效数据指历史表中结束日期等于最大日期),比较条件:除去开始日期和结束日期所有字段,当前数据不在历史表中的数据插入“增改临时表”(INS表)中;
- 根据Upsert by的条件更新历史表中数据,对更新数据进行封口,置结束日期为$tx_date;
- 将临时表中数据置开始日期(rep_dt)为$tx_date和结束日期(sttm_dt)为$MAXDATE,其他数据不变,“增改临时表”数据插入历史表中。
逻辑图
F5算法
F5算法:全量,历史拉链(自动找出删除增量)(FullData History Chain)。
- F5算法与F3的数据生成相同,区别在于多生成2个临时表,分别是PRE(以前)UPD(更改);
- PRE中数据是以sttm_dt(结算日期)=$maxdate从历史表中取出的数据;
- INS的生成数据是将“当前临时表”(cur_i)中数据在pre表中数据比较,不存在的数据插入到INS中;
- UPD的生成数据是将pre表中数据在“当前临时表”(cur_i)中的数据比较,不存在数据插入到UPD中;
- 删除历史表中已UPD为条件的数据后将UPD数据插入历史表中;
- 将INS数据插入目标表中。
逻辑图
适用场景:一般用于增量数据,数据量较大的,变动频率不高的,反应历史情况的数据,存在特殊情况,按需选取。
F8算法
F8算法:全量,更新插入(UPSERT,自动找出删除数据)。
逻辑说明:FullData Upsert,全量Upsert算法,与F2算法相比,多出了自动找出删除的数据这一功能。
适用场景:仅适用于源表是全量并且有更新和删除数据的时候。
I算法
I算法:增量,根据增量条件加载数据(append)。
逻辑说明:
- Append 算法只是对历史表仅仅插入新的数据;
- 建立“当前数据临时表”,将新增加载数据插入到“当前临时表”;
- 删除历史表中开始日期为输入日期;
- 将当前临时表中数据插入到历史表中
适用场景:一般用于增量数据,数据量较大的,变动频率较高的,反应历史情况的数据,这个没啥好说的啦,就是快照、切片算法啦,空间消耗极大,但是也没别的办法啦。
递归查询
- 定义:递归查询是一种非常有用的技术,在查询树形结构、组织架构、层级关系等复杂数据时,经常会用到递归查询。递归查询可以让我们利用一条SQL语句完成对整个树形结构的查询,而不需要使用复杂的循环逻辑来逐级遍历。
- 递归查询的原理:递归查询是基于联接自身表的原理实现的。自联接是指自己连接自己的过程,通过与自己相连的每一个记录循环匹配来实现递归查询。在Oracle中,我们通常需要使用公共表达式WITH RECURSIVE或CTE(Common Table Expression)来实现递归查询。通过CTE,我们可以创建一组虚拟表,这些表之间可以互相引用,从而简化递归查询的过程。
- 递归查询的基本语法如下:
WITH<递归公共表达式名称>( <递归公共表达式的列名>) AS
(
<递归公共表达式的初始选择>
UNION ALL
<递归公共表达式的递归部分>
)
<递归查询主体>
说明:其中,递归公共表达式包含两个部分
(1)递归公共表达式的初始选择:初始选择是递归查询开始的位置,它返回一组与递归公共表达式中定义的列匹配的记录集合。
(2)递归公共表达式的递归部分:递归部分是一个递归查询的过程,它会逐步地将所查询的范围扩大。
递归查询主体是由查询语句组成的,用于筛选和显示递归查询的结果。 - 递归查询实例
接下来我们将通过一个简单的例子演示如何使用递归查询来查询节点关系。
在下面的例子中,我们假设有一张节点关系表,其结构如下:
CREATE TABLE node(id INT PRIMARY KEY,node_name VARCHAR2(50),parent_id INT);
其中,id表示节点的唯一标识,node_name表示节点的名称,parent_id表示当前节点的父节点ID。
现在我们要查询出某个节点的所有子节点,我们可以使用递归查询来实现。
首先,我们需要找到一个初始选择,也就是我们开始查询的位置。在这个例子中,我们指定了查询节点ID为1,其SQL语句如下:
WITH node_cte(id, node_name, parent_id, level) AS(
SELECT id,node_name,parent_id,1 AS level FROM node WHERE id = 1
UNION ALL
SELECT n.id,n.node_name,n.parent_id,level + 1 FROM node n, node_cte c WHERE n.parent_id = c.id)
SELECT * FROM node_cte;
在这个例子中,我们创建了一个名为node_cte的公共表达式。在初始选择中,我们选择了节点ID为1的节点记录,并将其level属性设置为1。在递归部分中,我们通过联接自身表和当前公共表达式来逐级往下查询,直到找到所有的子节点。在联接条件中,我们使用了c.id来表示前一级别的节点ID,从而达到了递归查询的效果。
我们用SELECT语句来显示查询结果,并得到了如下的输出:
ID | NODE_NAME | PARENT_ID | LEVEL |
---|---|---|---|
1 | ROOT | NULL | 1 |
2 | CHILD1 | 1 | 2 |
3 | GRANDCHILD1 | 2 | 3 |
4 | GRANDCHILD2 | 2 | 3 |
5 | CHILD2 | 1 | 2 |
6 | GRANDCHILD3 | 5 | 3 |
7 | GRANDCHILD4 | 5 | 3 |
在结果中,我们可以看到从节点ID为1的节点开始,查询到了所有的子节点,级别逐级递增。
- 总结:递归查询是一种高效、便捷的查询方式,在处理层级数据和组织架构时十分有用。熟练掌握递归查询的技术,能够帮助我们更快速地处理和分析数据,并提高数据的查询效率。
作者:liuyang 创建时间:2023-09-20 11:26
最后编辑:liuyang 更新时间:2023-10-23 13:28
最后编辑:liuyang 更新时间:2023-10-23 13:28