Snowflake cloud data platform 雪花CDC从S3到雪花

Snowflake cloud data platform 雪花CDC从S3到雪花,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我有一个S3存储桶,它每天早上从oracle向S3传输数据。 通过使用Snowpipe,我将数据加载到名为t1的Snowflake表中。 现在我正在创建一个新的表t2,它将包含来自表t1的cdc数据 我知道我们可以使用任务和流来捕获这一点。但是,streams将捕获记录上的事件插入、更新或删除。但在我们的例子中,我们将数据附加到t1中,并尝试将更新id列加载到t2中 例如,在第1天,将加载表T1 Table t1 id salary load_date -- ---

我有一个S3存储桶,它每天早上从oracle向S3传输数据。 通过使用Snowpipe,我将数据加载到名为t1的Snowflake表中。 现在我正在创建一个新的表t2,它将包含来自表t1的cdc数据

我知道我们可以使用任务和流来捕获这一点。但是,streams将捕获记录上的事件插入、更新或删除。但在我们的例子中,我们将数据附加到t1中,并尝试将更新id列加载到t2中

例如,在第1天,将加载表T1

Table t1
id      salary      load_date
--      ------      ----------
1       12000       12-03-2021
2       32000       12-03-2021
3       33000       12-03-2021
表t2将直接从t1加载

表t2

id      salary      load_date
--      ------      ----------
1       12000       12-03-2021
2       32000       12-03-2021
3       33000       12-03-2021
现在是第2天,因为我们直接将数据附加到表t1中。 看起来像这样

id      salary      load_date
--      ------      ----------
1       12000       12-03-2021
2       32000       12-03-2021
3       33000       12-03-2021
5       12500       13-03-2021
2       45000       13-03-2021
现在,表t2应该更新了id 2的值和id 5的新值, 如下

我觉得流不会有帮助,因为主表(t1)中没有更新, 因此,计划在t1的表t2上使用task和merge语句 差不多

CREATE OR REPLACE TASK EMPLOYEES_CDC
  WAREHOUSE = COMPUTE_WH
  SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles'
AS
merge INTO t2 using (select * from t2 where load_date = current_date) t3 on t2.id = t3.id
      when matched then update t2.salary = t1.salary
      when not matched then insert (id,salary,load_date) values (t3.id,t3.salary,t3.load_date)
因为合并看起来有点贵


请建议这是一种最佳方法还是有更好的方法。您描述的解决方案是解决此问题的最佳方法。 流肯定会有帮助,您所需要做的就是将merge语句更改为使用流而不是table
t1
。因此,您的merge语句将只处理delta。

为什么不引用这个可以帮助您确定如何应用流的语句呢


您需要确保在外部表上创建流,然后使用它。虽然外部表上的流有一些限制,但您也要检查您的用例。

如何识别T1中的删除?是否有另一列具有操作类型或其他内容?@SimonDarr没有删除。。只需每天直接将表从S3追加到t1即可。不考虑删除更新。对于操作类型,没有其他列,因为您的源系统从不删除数据,所以我认为您的一般追加/合并过程很好。我同意使用流,但我唯一想知道的是,在表t1中,它始终是直接插入的,没有更新。。那么流有什么用呢。不是吗?它将与实际表格相同。流将有新的记录插入到t1,这意味着增量,如果在合并中使用t1,则需要找出最新的记录DAN正在使用加载日期来标识最新的记录。由于表将自然地由该列进行集群,所以我认为它应该与使用流一样快?
CREATE OR REPLACE TASK EMPLOYEES_CDC
  WAREHOUSE = COMPUTE_WH
  SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles'
AS
merge INTO t2 using (select * from t2 where load_date = current_date) t3 on t2.id = t3.id
      when matched then update t2.salary = t1.salary
      when not matched then insert (id,salary,load_date) values (t3.id,t3.salary,t3.load_date)