我想在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似乎过于局限。
诚然,我不是Java语言程序员。我也不太熟悉Snowflake的Javascript UDF功能。我可以在JavaScript存储过程中执行所需的查询。但是,这些似乎并没有转化为UDF。
答案 0 :(得分:0)
仅当您在设置的保留期内不对数据执行任何操作时,雪花流才应过时。只要您有一个任务来处理流中的数据(更改记录)在它们出现时就可以了。因此,如果您6个月内未在Stream中看到任何更改,那很好,只要您在数据保留期内(例如14天)处理该更改记录。
如果您的任务具有STREAM_HAS_DATA
条件,并且流在14天内没有获取数据,则该流将过时,因为仅在查询流时才更新其偏移量。您可以通过消除条件并让任务更频繁地运行来解决此问题。
答案 1 :(得分:0)
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
命令返回的 SHOW STREAMS
时间戳属性,以便我们可以及时重新创建即将过时的流。
此处提供了一种检索陈旧流的解决方案:Snowflake - How can I query the stream's metadata and save to table