目前我正在从oracle采购数据
作为初始加载的一部分,使用named stage和copy into命令将oracle表oracle_a中的所有历史数据摄取到雪花表"snow_a“中。
我想在基于oracle_a表的snow_a表上执行SCD2。
我的意思是,如果向Oracle_a表中添加了任何新记录,那么将插入该记录并对oracle_a表的现有记录进行任何更改,
要过期的snow_a表的现有记录并插入该记录。更多细节见下图。
oracle_a表有key_col1、key_col2、key_col3三个键列,如下图所示。attr1和attr2是表enter image description here的其他属性
发布于 2019-10-29 00:13:44
在Snowflake中的表上实现SCD Type 2功能与在任何其他关系数据库中没有什么不同。但是,还有一些额外的功能可以帮助您完成此过程。请看看这篇关于使用Snowflake Streams和Tasks执行SCD逻辑的博客文章系列。https://www.snowflake.com/blog/building-a-type-2-slowly-changing-dimension-in-snowflake-using-streams-and-tasks-part-1/
干杯,迈克尔·雷尼
发布于 2019-10-26 01:52:15
好了,这就是我发现的--尽管你可能需要调整更新和插入的来源--因为oracle_a不在雪花中。
CREATE TABLE snowflake_a(key_col1 varchar(10), key_col2 varchar(10), key_col3 varchar(10), attr1 varchar(8), attr2 varchar(10), eff_ts TIMESTAMP, exp_ts TIMESTAMP, valid varchar(10));
DROP table oracle_a;
INSERT INTO snowflake_a VALUES('PT_1', 'DL_1', 'RPT_1', 'Address1', 'APT_1', current_date, current_date, 'Active');
CREATE TABLE oracle_a(key_col1 varchar(10), key_col2 varchar(10), key_col3 varchar(10), attr1 varchar(8), attr2 varchar(8), eff_ts TIMESTAMP, exp_ts TIMESTAMP);
INSERT INTO oracle_a
VALUES( 'PT_1', 'DL_1', 'RPT_1', 'Address1', 'APT_1', '10/24/2019', '12/31/1999');
UPDATE snowflake_a
SET valid = 'Expired'
WHERE valid LIKE '%Active%';
SELECT * FROM snowflake_a;
INSERT INTO snowflake_a VALUES( 'PT_1', 'DL_1', 'RPT_1', 'Address1', 'APT_1', '10/24/2019', '12/31/1999', 'Active');
SELECT * FROM snowflake_a;

或者更好的是,我们使用什么来从您的Oracle生态系统连接到Snowflake生态系统?
发布于 2019-10-28 23:30:15
从这个问题可以看出,传入的Oracle行似乎不包含任何SCD2类型的列,而且插入到snowflake中的每一行都是使用SCD2类型功能插入的。
SCD2列可以具有对业务的特定含义,例如'exp_ts‘可以是实际日期或业务日期。Snowflake 'Stage‘不包含SCD2功能。这通常是ETL框架的角色,而不是‘快速/批量’加载实用程序的角色。
大多数ETL供应商都将SCD2函数作为其产品的一部分。
https://stackoverflow.com/questions/58550367
复制相似问题