雪花任务条件:当表有数据时

Posted

技术标签:

【中文标题】雪花任务条件:当表有数据时【英文标题】:Snowflake Task Condition: When Table Has Data 【发布时间】:2020-08-13 13:34:46 【问题描述】:

我想在我的 Snowflake 任务中包含一个条件,以便仅当指定表中有数据时才运行。这将类似于任务条件:

WHEN SYSTEM$STREAM_HAS_DATA('my_schema.my_table')

除非我不想使用流。在某些情况下使用流的问题是流可能会过时。我的 ELT 流程中有一些表格可能几周或几个月都不会收到更新。甚至可能几年。

我的一个想法是在任务条件中使用 UDF:

WHEN PUBLIC.TABLE_HAS_DATA('my_schema.my_table')

如果我能在里面扔一个SELECT CAST(COUNT(1) AS BOOLEAN) FROM "my_schema"."my_table",那就太好了。但是对于作为参数传递的表名,SQL UDF 将无法执行任何操作。在查询表时,javascript UDF 似乎过于局限。

诚然,我不是 Javascript 程序员。我也不太熟悉 Snowflake 的 Javascript UDF 功能。我可以很好地在 Javascript 存储过程中执行所需的查询。但这些似乎并没有转化为 UDF。

【问题讨论】:

【参考方案1】:

Snowflake Streams 只有在您未在设置的保留期内对数据进行任何处理时才会过时。只要您有一个任务来处理流中的数据(更改记录),当它们出现时,您应该没问题。因此,如果您在 6 个月内未在流中看到更改,只要您在数据保留期内(例如 14 天)处理该更改记录就可以了。

如果您的任务有 STREAM_HAS_DATA 条件并且流在 14 天内没有获取数据,则流将过时,因为流的偏移量仅在查询时更新。您可以通过删除条件并让任务更频繁地运行来解决此问题。

【讨论】:

我就是这么想的。但是,我的流过时了,因此我的 ELT 任务失败了。当我深入研究数据时,有大量证据表明 - 如果基础表在 14 天内收到 0 个 CRUD,则流会过时。 14 天是不常用表的最重要保留期。 有趣,我不知道我是否遇到过这样的情况:我有一个流 14 天没有获取数据。我一定会亲自测试一下!【参考方案2】:

SYSTEM$STREAM_HAS_DATA适用于流https://docs.snowflake.com/en/sql-reference/functions/system_stream_has_data.html

由于流可能会过时,我们可以检查(自 2021 年 1 月发布的 Snowflake 5.1.x 以来)stale_after 命令返回的 stale_after 时间戳属性,以便我们可以及时重新创建即将过期的流过时了。

此处提供了一种检索陈旧流的解决方案:Snowflake - How can I query the stream's metadata and save to table

【讨论】:

以上是关于雪花任务条件:当表有数据时的主要内容,如果未能解决你的问题,请参考以下文章

刷新数据共享视图时运行雪花任务

在时间戳列中插入 Null 时,雪花复制到失败

父级暂停和子级恢复后雪花子任务未运行

在雪花中成功创建任务,但运行“显示任务”时没有显示

雪花程序因任务执行而失败

雪花数据加载最佳实践规范化还是非规范化?