在 Snowflake 中,一旦加载了所有相关对象,如何使新数据可用?

In Snowflake how to make NEW data available once all related objects have been loaded?

假设我们的 Snowflake 数据仓库中有维度数据模型,每天加载一次。要求是只有当所有对象都已成功加载时,最终用户才能使用今天加载的数据。

因此,如果维度 d1 今天已成功加载,但事实上 f1 加载因任何原因失败,那么最终用户应该保留昨天加载的数据(也适用于当时的维度 d1)。仅当所有维度模型对象都已成功加载时,才会切换到新数据。

我们目前的做法是将增量集/新数据暂存到 tables,一旦全部成功,然后有一个巨大的 SQL 脚本正在执行 DELETE/INSERT 一维模型 table 一次,然后最后一次提交。所以 enda 数据加载不是并行完成的。

有没有更好的方法达到要求?我们正在考虑物化视图(加载所有底层维度模型 tables 并刷新“select * from table”mat.views)但它们在 Snowflake 中自动刷新。此外,从源到目标 table 的 DROP 目标 table / CLONE 也不适合我们,因为目标 table 有可能在不存在时被查询。

我不明白你为什么去掉 CLONE 选项。您不需要克隆每个对象,您可以使用一个命令克隆整个数据库或模式,使其可供您的用户使用。第二天,加载所有数据后,您可以 re-clone 该对象。这似乎是您想要实现的目标的理想解决方案。

https://community.snowflake.com/s/article/cloning-in-snowflake

CLONE操作不复制数据,它是一个元数据操作。因此它不会占用额外的 space 除非从 original/source 表中删除克隆数据,或者向克隆对象添加新数据:

https://docs.snowflake.com/en/user-guide/tables-storage-considerations.html#cloning-tables-schemas-and-databases

好的,我想我可能已经理解了你的问题陈述。但是让我重新表述一下,以便我确定我真的理解了它。您有多个维度 table 和一个事实 table。例如

你有 D1、D2、D3 作为维度 table 然后你有一个事实 table F1。您的日常 ETL 过程会加载 F1、D1、D2 和 D3。但是您只想在 F1 加载成功时使用新数据加载 D1、D2、D3,并且在加载过程中您不希望用户受到影响。

如果这是正确的,一种方法如下(这种方法的缺点是在 ETL 期间会产生额外的存储成本)

当您的 ETL 开始时,从各自的 F1、D1、D2、D3 tables 克隆新的 tables F1'、D1'、D2'、D3'。首先加载增量数据到F1'、D1'、D2'和D3'。如果所有这些 table 的加载成功,则执行 ALTER SWAP 并将 F1' 交换为 F1,将 D1' 交换为 D1,将 D2' 交换为 D2,将 D3' 交换为 D3。 Post 您可以截断 F1',D1',D2'D3' 并每天重复此过程。