雪花任务条件:当表有数据时
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
【讨论】:
以上是关于雪花任务条件:当表有数据时的主要内容,如果未能解决你的问题,请参考以下文章