现在有没有办法强制 运行 Snowflake 的任务(在下一个预定时间段之前)?
Is there a way to force run a Snowflake's TASK now (before the next scheduled slot)?
我有一个任务安排 运行 每 15 分钟:
CREATE OR REPLACE TASK mytask
WAREHOUSE = 'SHARED_WH_MEDIUM'
SCHEDULE = '15 MINUTE'
STATEMENT_TIMEOUT_IN_SECONDS = 3600,
QUERY_TAG = 'KLIPFOLIO'
AS
CREATE OR REPLACE TABLE mytable AS
SELECT * from xxx;
;
alter task mytask resume;
我从 task_history()
的输出中看到任务是 SCHEDULED
:
select * from table(aftonbladet.information_schema.task_history(task_name => 'MYTASK')) order by scheduled_time;
QUERY_ID NAME DATABASE_NAME SCHEMA_NAME QUERY_TEXT CONDITION_TEXT STATE ERROR_CODE ERROR_MESSAGE SCHEDULED_TIME COMPLETED_TIME RETURN_VALUE
*** MYTASK *** *** *** SCHEDULED 2020-01-21 09:58:12.434 +0100
但我现在想 运行 而不是等待 SCHEDULED_TIME ,有什么办法可以实现吗?
目前无法手动执行任务。但是,您可以将任务计划更改为 1 分钟,让它 运行,然后再更改回 15 分钟,这样您就不会等待整整 15 分钟。我已经多次看到此请求,并且 Lodge (https://community.snowflake.com/s/ideas) 上有一个您应该投票的想法(搜索 'Tasks',我认为这将是最重要的想法之一)。由于 Tasks 仍处于 Public 预览阶段,如果这些类型的想法有很多投票,它们可能会被审查并优先考虑。
以 Mike 的回答为基础:
- 您可以让任务每分钟执行一次,但前提是流中有数据!
- 为此,您可以创建一个 table 和流来决定是否每分钟触发一次任务。
- 此根任务应删除流中插入的数据以防止任务再次 运行ning。
- 这样您就可以拥有每次将数据带入流时执行的依赖任务,但仅当流具有新数据时才执行。
- 这依赖于 运行 一项任务的能力
when SYSTEM$STREAM_HAS_DATA()
-- stream so this task executes every minute, but only if there's new data
create table just_timestamps_stream_table(value varchar);
create stream just_timestamps_stream on table just_timestamps_stream_table;
-- https://docs.snowflake.com/en/user-guide/tasks-intro.html
create or replace task mytask_minute
warehouse = test_small
schedule = '1 MINUTE'
when SYSTEM$STREAM_HAS_DATA('just_timestamps_stream')
as
-- consume stream so tasks doesn't execute again
delete from just_timestamps_stream_table;
-- the real task to be executed
create or replace task mytask_minute_child1
warehouse = test_small
after mytask_minute
as
insert into just_timestamps values(current_timestamp, 'child1');
完整示例:
Snowflake 现在支持 运行 手动任务。只需使用 EXECUTE TASK 命令:
EXECUTE TASK manually triggers an asynchronous single run of a scheduled task (either a standalone task or the root task in a task tree) independent of the schedule defined for the task. A successful run of a root task triggers a cascading run of child tasks in the tree as their precedent task completes, as though the root task had run on its defined schedule.
另外,不需要启动模式的任务。即使是暂停模式下的任务也可以手动执行。
我有一个任务安排 运行 每 15 分钟:
CREATE OR REPLACE TASK mytask
WAREHOUSE = 'SHARED_WH_MEDIUM'
SCHEDULE = '15 MINUTE'
STATEMENT_TIMEOUT_IN_SECONDS = 3600,
QUERY_TAG = 'KLIPFOLIO'
AS
CREATE OR REPLACE TABLE mytable AS
SELECT * from xxx;
;
alter task mytask resume;
我从 task_history()
的输出中看到任务是 SCHEDULED
:
select * from table(aftonbladet.information_schema.task_history(task_name => 'MYTASK')) order by scheduled_time;
QUERY_ID NAME DATABASE_NAME SCHEMA_NAME QUERY_TEXT CONDITION_TEXT STATE ERROR_CODE ERROR_MESSAGE SCHEDULED_TIME COMPLETED_TIME RETURN_VALUE
*** MYTASK *** *** *** SCHEDULED 2020-01-21 09:58:12.434 +0100
但我现在想 运行 而不是等待 SCHEDULED_TIME ,有什么办法可以实现吗?
目前无法手动执行任务。但是,您可以将任务计划更改为 1 分钟,让它 运行,然后再更改回 15 分钟,这样您就不会等待整整 15 分钟。我已经多次看到此请求,并且 Lodge (https://community.snowflake.com/s/ideas) 上有一个您应该投票的想法(搜索 'Tasks',我认为这将是最重要的想法之一)。由于 Tasks 仍处于 Public 预览阶段,如果这些类型的想法有很多投票,它们可能会被审查并优先考虑。
以 Mike 的回答为基础:
- 您可以让任务每分钟执行一次,但前提是流中有数据!
- 为此,您可以创建一个 table 和流来决定是否每分钟触发一次任务。
- 此根任务应删除流中插入的数据以防止任务再次 运行ning。
- 这样您就可以拥有每次将数据带入流时执行的依赖任务,但仅当流具有新数据时才执行。
- 这依赖于 运行 一项任务的能力
when SYSTEM$STREAM_HAS_DATA()
-- stream so this task executes every minute, but only if there's new data
create table just_timestamps_stream_table(value varchar);
create stream just_timestamps_stream on table just_timestamps_stream_table;
-- https://docs.snowflake.com/en/user-guide/tasks-intro.html
create or replace task mytask_minute
warehouse = test_small
schedule = '1 MINUTE'
when SYSTEM$STREAM_HAS_DATA('just_timestamps_stream')
as
-- consume stream so tasks doesn't execute again
delete from just_timestamps_stream_table;
-- the real task to be executed
create or replace task mytask_minute_child1
warehouse = test_small
after mytask_minute
as
insert into just_timestamps values(current_timestamp, 'child1');
完整示例:
Snowflake 现在支持 运行 手动任务。只需使用 EXECUTE TASK 命令:
EXECUTE TASK manually triggers an asynchronous single run of a scheduled task (either a standalone task or the root task in a task tree) independent of the schedule defined for the task. A successful run of a root task triggers a cascading run of child tasks in the tree as their precedent task completes, as though the root task had run on its defined schedule.
另外,不需要启动模式的任务。即使是暂停模式下的任务也可以手动执行。