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

Posted

技术标签:

【中文标题】刷新数据共享视图时运行雪花任务【英文标题】:Run Snowflake Task when a data share view is refreshed 【发布时间】:2019-12-04 20:04:14 【问题描述】:

Snowflake 的文档说明了当有插入/更新/删除或其他 DML 操作在该特定表上运行时,通过在该特定表上创建一个 STREAM 来按计划运行 TASK。

如果来自外部 Snowflake 数据共享的视图被刷新(即删除并重新创建),是否有任何方法可以运行 TASK?

作为此提议管道的一部分,我们会在一天中的特定时间段内收到一次视图刷新,目标是启动在该时间段内最多运行一次的下游管道,当视图被刷新。

例如对于以下 TASK 计划 'USING CRON 0,10,20,30,40,50 8-12 * * MON,WED,FRI America/New York',下游管道应该只在每周一、三、五8-12点之间运行一次。

【问题讨论】:

【参考方案1】:

是的,如果您想查看这是否适用于您可能已经设置的表,我可以将您指向文档:

如果来自外部的视图,有什么方法可以运行 TASK 雪花数据共享已刷新,即删除并重新创建?

如果你创建一个存储过程来监控表的存在,虽然我之前没有尝试过,我看看我是否可以请教高手。

另外,有没有办法保证任务最多运行 在特定日期或其他时间段内一次?

是的,您可以使用 CRON 来安排带有一周中特定日期或时间的可选参数:例如:

CREATE TASK delete_old_data
WAREHOUSE = deletion_wh
SCHEDULE = 'USING CRON 0 0 * * * UTC';

参考:https://docs.snowflake.net/manuals/user-guide/tasks.html 更具体地说:https://docs.snowflake.net/manuals/sql-reference/sql/create-task.html#optional-parameters

【讨论】:

对于我的问题的第二部分,它没有明确表达,但基本上我们会在特定时间段内收到一次视图刷新,目标是在在那个时间段内最多一次。例如,对于以下时间表 'USING CRON 0,10,20,30,40,50 8-12 * * MON,WED,FRI America/New York',下游管道应仅在给定日期运行一次【参考方案2】:

TASK 只能由日历计划触发,直接或间接通过由计划运行的前任 TASK 触发。

由于任务仅按计划运行,因此它们的运行频率不会超过计划规定的频率。

TASK 不能由数据共享更改触发,因此您必须按日历计划对其进行监控。

此限制一定会在某个时候取消,但自 2019 年 12 月起生效。

【讨论】:

嗯,通过设置 STREAM 来捕获任何 DML 命令,绝对可以根据表中的更改触发 TASK。您是说该功能已禁用/不可用于数据共享? 你怎么能做到这一点?该文档讨论了安排 TASK 以定期处理流,并且您有一个特殊的 TASK WHEN 条件来检查流,但反之则不然。 我的理解是任务是基于某个时间间隔(调度)执行的。当数据发生变化时,它们不会自动触发 @SimonD 是的,您可以触发任务定期运行,例如。每 10 分钟一次,或根据每 m/h/D/M/W 的 cron 计划。 pipe 可以由例如 S3 事件或 REST api 调用触发,但任何其他操作必须由数据库客户端命令触发。据我所知,除了 TASK 之外,Snowflake 没有真正的触发器。

以上是关于刷新数据共享视图时运行雪花任务的主要内容,如果未能解决你的问题,请参考以下文章

雪花数据共享 - 授予部分执行 |授予未执行

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

数据推送到 Snowflake 阶段时触发 Snowflake 任务

预发环境与生产环境共享数据库时定时任务重复执行问题解决

Snowflake - 数据新鲜度缓存

snowflake.com / 意见 / sdk