CREATE TASK

在当前/指定的架构中创建新任务或替换现有任务。

该命令支持以下变体:

有关任务的信息,请参阅 任务简介

另请参阅:

ALTER TASKDROP TASKSHOW TASKSDESCRIBE TASK

CREATE OR ALTER <对象>

重要

新创建任务或克隆任务在创建时会被暂停。有关运行已暂停任务的信息,请参阅 ALTER TASK ...RESUMEEXECUTE TASK

语法

CREATE [ OR REPLACE ] TASK [ IF NOT EXISTS ] <name>
    [ WITH TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
    [ { WAREHOUSE = <string> } | { USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = <string> } ]
    [ SCHEDULE = '{ <num> MINUTE | USING CRON <expr> <time_zone> }' ]
    [ CONFIG = <configuration_string> ]
    [ ALLOW_OVERLAPPING_EXECUTION = TRUE | FALSE ]
    [ <session_parameter> = <value> [ , <session_parameter> = <value> ... ] ]
    [ USER_TASK_TIMEOUT_MS = <num> ]
    [ SUSPEND_TASK_AFTER_NUM_FAILURES = <num> ]
    [ ERROR_INTEGRATION = <integration_name> ]
    [ SUCCESS_INTEGRATION = <integration_name> ]
    [ COMMENT = '<string_literal>' ]
    [ FINALIZE = <string> ]
    [ TASK_AUTO_RETRY_ATTEMPTS = <num> ]
    [ USER_TASK_MINIMUM_TRIGGER_INTERVAL_IN_SECONDS = <num> ]
  [ AFTER <string> [ , <string> , ... ] ]
  [ WHEN <boolean_expr> ]
  [ TARGET_COMPLETION_INTERVAL = '{ <num> MINUTES | MINUTE | M }' ]
  [ SERVERLESS_TASK_MIN_STATEMENT_SIZE = '{ XSMALL | SMALL | MEDIUM | LARGE | XLARGE | XXLARGE | ... }' ]
  [ SERVERLESS_TASK_MAX_STATEMENT_SIZE = '{ XSMALL | SMALL | MEDIUM | LARGE | XLARGE | XXLARGE | ... }' ]
  AS
    <sql>
Copy

变体语法

CREATE OR ALTER TASK

如果任务尚不存在,则创建一个新任务,或者将现有任务转换为语句中定义的任务。CREATE OR ALTER TASK 语句遵循 CREATE TASK 语句的语法规则,并具有与 ALTER TASK 语句相同的限制。

支持的任务更改包括:

  • 更改任务属性和参数。例如,SCHEDULE、USER_TASK_TIMEOUT_MS 或 COMMENT。

  • 设置、取消设置或更改任务前置任务。

  • 设置、取消设置或更改任务条件(WHEN 子句)。

  • 更改任务定义(AS 子句)。

有关更多信息,请参阅 CREATE OR ALTER TASK 使用说明

CREATE OR ALTER TASK <name>
    [ { WAREHOUSE = <string> } | { USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = <string> } ]
    [ SCHEDULE = '{ <num> MINUTE | USING CRON <expr> <time_zone> }' ]
    [ CONFIG = <configuration_string> ]
    [ ALLOW_OVERLAPPING_EXECUTION = TRUE | FALSE ]
    [ USER_TASK_TIMEOUT_MS = <num> ]
    [ <session_parameter> = <value> [ , <session_parameter> = <value> ... ] ]
    [ SUSPEND_TASK_AFTER_NUM_FAILURES = <num> ]
    [ ERROR_INTEGRATION = <integration_name> ]
    [ SUCCESS_INTEGRATION = <integration_name> ]
    [ COMMENT = '<string_literal>' ]
    [ FINALIZE = <string> ]
    [ TASK_AUTO_RETRY_ATTEMPTS = <num> ]
  [ AFTER <string> [ , <string> , ... ] ]
  [ WHEN <boolean_expr> ]
  AS
    <sql>
Copy

CREATE TASK ...CLONE

创建具有相同参数值的新任务:

CREATE [ OR REPLACE ] TASK <name> CLONE <source_task>
  [ ... ]
Copy

有关更多详细信息,请参阅 CREATE <object> ...CLONE

备注

使用 CREATE TASK <name> CLONE 克隆任务或克隆包含任务的架构时,除非显式覆盖,否则会复制所有基础任务属性。

必填参数

name

指定任务标识符的字符串;对于在其中创建任务的架构必须是唯一的。

此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(如 "My object")。放在双引号内的标识符也区分大小写。

有关更多详细信息,请参阅 标识符要求

sql

以下任意一项:

  • 单一 SQL 语句

  • 调用存储过程

  • 使用 Snowflake Scripting 的过程逻辑

    Snowsight 不支持创建或修改任务以使用 Snowflake Scripting。请改用 SnowSQL 或其他命令行客户端。

SQL 代码在任务运行时执行。在任务中使用之前,请验证 {sql} 是否按预期执行。

备注

无服务器任务支持使用 Java 或 Python 外部函数。但是,无服务器任务不能调用在 Snowflake 内部开发的以下对象类型和函数:

  • 包含 Java 或 Python 代码的 UDFs(用户定义的函数)。

  • 以 Scala(使用 Snowpark)编写的存储过程,或者调用包含 Java 或 Python 代码的 UDFs 的存储过程。

可选参数

WAREHOUSE = string . USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string

WAREHOUSE = string

指定为任务运行提供计算资源的虚拟仓库。

若省略此参数,可在运行此任务时使用无服务器计算资源。Snowflake 会根据每个工作负载的需要,从大小上自动调整和扩展无服务器计算资源。当为任务指定了计划时,Snowflake 会调整资源大小,以便在指定的时间范围内完成任务的未来运行。要指定任务的初始仓库大小,请设置 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string 参数。

USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string

仅适用于 Serverless Task。

指定要为首次运行任务预配的计算资源的大小,然后 Snowflake 可以使用任务历史记录来确定理想大小。任务成功完成几次运行后,Snowflake 将忽略此参数设置。

请注意,如果任务历史记录不适用于给定任务,则计算资源将还原为此初始大小。

备注

如果指定了 WAREHOUSE = string 参数值,则设置此参数将产生用户错误。

大小等同于创建仓库(使用 CREATE WAREHOUSE)时可用的计算资源,如 SMALLMEDIUMLARGE。参数支持的最大大小为 XXLARGE。如果省略该参数,则使用中型 (MEDIUM) 仓库执行任务的第一次运行。

您可以在任务创建 之后、成功运行一次 之前 更改初始大小(使用 ALTER TASK)。在此任务的首次运行启动后更改该参数,这对当前或未来任务运行的计算资源没有影响。

请注意,暂停和恢复任务不会移除用于调整计算资源大小的任务历史记录。仅当重新创建任务(使用 CREATE OR REPLACE TASK 语法)时,才会移除任务历史记录。

有关此参数的详细信息,请参阅 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE

SCHEDULE ...

指定定期运行任务的计划:

备注

  • 对于 触发任务,不需要计划。对于其他任务,必须任务图 中的独立任务或根任务定义计划;否则只有在使用 EXECUTE TASK 手动执行时,任务才会运行。

  • 不能 为任务图中的子任务指定计划。

  • USING CRON expr time_zone

    指定用于定期运行任务的 cron 表达式和时区。支持标准 cron 实用程序语法的子集。

    有关时区列表,请参阅 ` tz 数据库时区列表 <https://en.wikipedia.org/wiki/List_of_tz_database_time_zones (link removed)>`_ (在维基百科中)。

    cron 表达式由以下字段组成:

    # __________ minute (0-59)
    # | ________ hour (0-23)
    # | | ______ day of month (1-31, or L)
    # | | | ____ month (1-12, JAN-DEC)
    # | | | | _ day of week (0-6, SUN-SAT, or L)
    # | | | | |
    # | | | | |
      * * * * *
    
    Copy

    支持以下特殊字符:

    *

    通配符。指定字段的任何出现。

    L

    代表“last”。在星期几字段中使用时,它允许您指定结构,例如给定月份的“最后一个星期五”(“5L”)。在日期字段中,它指定该月的最后一天。

    /n

    指示给定时间单位的第 n 个实例。每个时间量子都是独立计算的。例如,如果在月份字段中指定 4/3,则任务将安排在 4 月、7 月和 10 月执行(即从一年中的第 4 个月开始,每 3 个月一次)。在随后的几年中保持相同的计划。也就是说,任务 不会 安排在 1 月(10 月运行后 3 个月)运行。

    备注

    • cron 表达式当前仅根据指定的时区进行计算。更改账户的 TIMEZONE 参数值(或在用户或会话级别设置该值) :emph:` 不会 ` 更改任务的时区。

    • cron 表达式定义任务的所有 :emph:` 有效 ` 运行时间。Snowflake 尝试根据此计划运行任务;但是,如果在下一个有效运行时间开始之前未完成上一次运行,则跳过任何有效运行时间。

    • 当 cron 表达式中同时包含一个月中的特定日期和一周中的某一天时,任务将安排在满足一个月中某一天条件 :emph:` 或 ` 一周中某一天条件的日期运行。例如, SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC' 计划在每月的任何 10 到 20 天以及这些日期之外任何星期二或星期四的 0AM 运行任务。

    • cron 中最短的时间粒度为分钟。如果任务在其 cron 表达式中定义的分钟内恢复,则该任务的第一次计划运行就是 cron 表达式实例的下一次出现。例如,如果计划在每天午夜 (USING CRON 0 0 * * *) 运行的任务在午夜过后 5 秒 (00:00:05) 恢复,则第一次任务运行将在下一个午夜开始。

  • num MINUTE

    指定在任务运行之间插入的等待时间间隔(以分钟为单位)。仅接受正整数。

    还支持 num M 语法。

    为避免歧义,在以下情况下需设置 基本间隔时间

    基本间隔时间从当前时钟时间开始间隔计数器。例如,如果将 INTERVAL 值设置为 10,并且在 9:03 AM 启用任务,则任务将在 9:13 AM、9:23 AM 运行,以此类推。请注意,我们会尽最大努力确保绝对精度,但仅保证任务在其设置间隔发生 之前 不执行。例如,在当前示例中,任务可以在 9:14 AM 首次运行,但不会在 9:12 AM 运行。

    备注

    支持的最大值为 11520 (8 天)。num MINUTE 值超过此值的任务永远不会运行。

CONFIG = configuration_string

指定任务图中所有任务都可以访问的键值对的字符串表示形式。必须采用 JSON 格式。如需详细了解如何获取当前正在运行的任务的配置字符串,请参阅 SYSTEM$GET_TASK_GRAPH_CONFIG

备注

此参数只能在根任务上设置,该设置适用于任务图中的所有任务。

可以在独立任务上设置此参数,但此参数不影响任务行为。Snowflake 会确保在给定时间仅运行独立任务的一个实例。

ALLOW_OVERLAPPING_EXECUTION = TRUE | FALSE

指定是否允许任务图的多个实例同时运行。

备注

此参数只能在根任务上设置,该设置适用于任务图中的所有任务。

可以在独立任务上设置此参数,但此参数不影响任务行为。Snowflake 会确保在给定时间仅运行独立任务的一个实例。

  • TRUE 如果在根任务的下一次计划运行发生时,任何子任务的当前运行仍在进行中,则任务图的另一个实例将会开始。如果根任务在下一个计划运行时间到来时仍在运行,则会跳过该计划时间。

  • FALSE 只有在该任务图中的所有子任务都运行完毕后,才会安排根任务的下一次运行。这意味着,如果运行任务图中所有任务所需的累积时间超过了根任务定义中设置的明确计划时间,则至少会跳过任务图的一次运行。

默认:FALSE

session_parameter = value [ , session_parameter = value ... ]

指定任务运行时要为会话设置的会话参数的逗号分隔列表。任务支持所有会话参数。有关完整列表,请参阅 会话参数

USER_TASK_TIMEOUT_MS = num

指定任务超时前单次运行的时间限制(以毫秒为单位)。

备注

  • 在大幅提升任务的时间限制之前,请考虑是否可以(通过重写语句或使用存储过程)优化任务启动的 SQL 语句,或是否应增大仓库大小。

  • 在某些情况下,STATEMENT_TIMEOUT_IN_SECONDS 参数优先于 USER_TASK_TIMEOUT_MS。有关详细信息,请参阅 STATEMENT_TIMEOUT_IN_SECONDS

有关此参数的详细信息,请参阅 USER_TASK_TIMEOUT_MS

值:0 - 86400000 (1 天)。

默认::code:`3600000`(1 小时)

SUSPEND_TASK_AFTER_NUM_FAILURES = num

指定当前任务在任务连续多少次运行失败后会自动暂停。失败的任务运行包括任务主体中的 SQL 代码产生用户错误或超时的运行。由于系统错误而跳过、取消或失败的任务运行被视为不确定,不会包含在失败的任务运行次数中。

在任务图中的独立任务或根任务上设置此参数。将此参数设置为大于 0 的值时,以下行为适用于独立任务或任务图的运行:

  • 在连续任务运行失败或超时达到指定次数后,独立任务会自动暂停。

  • 任务图中的 任何 单个任务连续运行失败或超时达到指定次数后,根任务将自动暂停。

当此参数设置为 0 时,不会自动暂停失败的任务。

该设置应用于依赖无服务器计算资源或虚拟仓库计算资源的任务。

有关此参数的详细信息,请参阅 SUSPEND_TASK_AFTER_NUM_FAILURES

值:0 - 无上限。

默认:10

ERROR_INTEGRATION = 'integration_name'

仅当将任务配置为使用 Amazon Simple Notification Service (SNS)、Microsoft Azure 事件网格或 Google Pub/Sub 发送错误通知时才是必需的。

指定用于与 Amazon SNS、MS Azure 事件网格或 Google Pub/Sub 通信的通知集成的名称。有关更多信息,请参阅 启用任务通知

SUCCESS_INTEGRATION = 'integration_name'

仅当将任务配置为使用 Amazon Simple Notification Service (SNS)、Microsoft Azure 事件网格或 Google Pub/Sub 发送成功通知时才是必需的。

指定用于与 Amazon SNS、MS Azure 事件网格或 Google Pub/Sub 通信的通知集成的名称。有关更多信息,请参阅 启用任务通知

COMMENT = 'string_literal'

指定任务的注释。

默认:无值

AFTER string [ , string , ... ]

指定当前任务的一个或多个前置任务。使用此选项可创建 任务图,或将此任务添加到现有任务图中。任务图是一系列任务,从计划的根任务开始,并通过依赖关系链接在一起。

请注意,任务图的结构可以在创建其所有组成任务之后定义。执行 ALTER TASK ...ADD AFTER 语句,为规划的任务图中的每个任务指定前置任务。

一项任务在其所有前置任务成功完成自己的运行后运行(在短暂滞后之后)。

备注

  • 根任务应具有明确的计划。每个子任务都必须有一个或多个已定义的前置任务(使用 AFTER 参数指定),才能将任务链接在一起。

  • 一个任务最多可有 100 个前置任务和 100 个子任务。此外,任务图最多 总共 可有 1000 个处于已恢复或已暂停状态的任务(包括根任务)。

  • 账户目前最多可有 30000 个已恢复的任务。

  • 任务图中的所有任务必须具有相同的任务所有者。单个角色必须对任务图中的所有任务拥有 OWNERSHIP 权限。

  • 任务图中的所有任务必须存在于同一架构中。

  • 在重新创建 任何 任务(使用 CREATE OR REPLACE TASK 语法)或者添加(使用 CREATE TASK ...AFTER 或 ALTER TASK ...ADD AFTER)或移除子任务(使用 ALTER TASK ... REMOVE AFTER)之前,必须暂停根任务。

  • 如果任务图中的任意任务被克隆,则默认情况下,克隆该任务的角色将成为克隆任务的所有者。

    • 如果原始任务的所有者创建了克隆,则克隆任务将保留原始任务与前置任务之间的链接。这意味着同一个前置任务同时触发原始任务和克隆任务。

    • 如果其他角色创建了克隆,则克隆任务可以有计划,但不能有前置任务。

  • 当前限制:

    • Snowflake 保证,在给定时间最多有一个具有定义计划的任务实例正在运行;但是,对于具有已定义前置任务的任务,我们无法提供相同的保证。

WHEN boolean_expr

指定一个布尔 SQL 表达式;支持用 AND/OR 联接的多个条件。当任务被触发时(基于其 SCHEDULEAFTER 设置),它会验证表达式的条件以确定是否执行。如果 :emph:` 不 ` 满足表达式的条件,则任务跳过当前运行。将此任务标识为前置任务的任何任务也都不会运行。

任务 WHEN 子句支持以下内容:

  • SYSTEM$STREAM_HAS_DATA 支持用于在 SQL 表达式中进行评估。

    此函数指示指定的流是否包含变更跟踪数据。在开始当前运行之前,可以使用此函数评估指定的流是否包含变更数据。如果结果为 FALSE,则任务不会运行。

    备注

    SYSTEM$STREAM_HAS_DATA 旨在避免返回 FALSE 值(即使流包含变更数据)。但是,当流不包含变更数据时,此函数不能保证避免返回 TRUE 值。

  • SYSTEM$GET_PREDECESSOR_RETURN_VALUE 支持用于在 SQL 表达式中进行评估。

    此函数检索任务图中前置任务的返回值。 返回值可用作布尔表达式的一部分。 使用 SYSTEM$GET_PREDECESSOR_RETURN_VALUE 时,如果需要,可以将返回值转换为相应的数值、字符串或布尔类型。

    简单示例包括:

    WHEN NOT SYSTEM$GET_PREDECESSOR_RETURN_VALUE('task_name')::BOOLEAN
    
    Copy
    WHEN SYSTEM$GET_PREDECESSOR_RETURN_VALUE('task_name') != 'VALIDATION'
    
    Copy
    WHEN SYSTEM$GET_PREDECESSOR_RETURN_VALUE('task_name')::FLOAT < 0.2
    
    Copy

    备注

    不支持在以下表达式中使用 PARSE_JSON,因为它需要基于仓库的计算资源: TASK ...不支持 WHEN 表达式,因为该表达式需要基于仓库的计算资源。

  • 布尔运算符,例如 AND、 OR、 NOT 等。

  • 在数值、字符串和布尔类型之间进行转换。

  • 比较运算符,例如 equal、not equal、greater than、less than 等。

在对 WHEN 表达式的条件进行验证时,不需要计算资源。验证改为在云服务层中处理。每次任务评估其 WHEN 条件且未运行时,都会产生象征性费用。每次触发任务时,费用都会累积,直到任务运行为止。届时,费用将转换为 Snowflake Credit,并添加到任务运行的计算资源使用量中。

通常,与任务执行时间相比,用于验证条件的计算时间微不足道。最佳实践是,尽可能使计划的任务运行时间和实际的任务运行时间保持一致。避免与任务运行不一致的任务计划。例如,如果大约每 24 小时将数据插入具有流的表中一次,则不要安排每分钟检查一次流数据的任务。每次运行时用于验证 WHEN 表达式的费用通常微不足道,但费用会累积。

请注意,如果云服务的每日消耗量低于 计算资源每日使用量的 10% 配额,则不会累积云服务费用。

TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )

指定 标签 名称和标签字符串值。

标签值始终为字符串,标签值的最大字符数为 256。

有关在语句中指定标签的信息,请参阅 对象和列的标签配额

CREATE OR ALTER 变体语法不支持此参数。

FINALIZE = string

指定与终结器任务关联的根任务的名称。终结器任务在任务图中的所有其他任务运行完成之后运行。您可以定义终结器任务的 SQL,来处理任务图所使用的通知以及资源的释放和清理。有关更多信息,请参阅 任务图的释放和清理

  • 一个根任务只能有一个终结器任务。如果为一个根任务创建多个终结器任务,则任务创建将失败。

  • 终结器任务不能有任何子任务。任何尝试将终结器任务设为前置任务的命令都将失败。

  • 终结器任务不能有计划。如果创建带有计划的终结器任务,将会失败。

默认:无值

TASK_AUTO_RETRY_ATTEMPTS = num

指定任务图自动重试的次数。如果任何任务图在 FAILED 状态下完成,Snowflake 可以自动从失败的图中的最后一个任务重试任务图。

任务图自动重试功能默认处于禁用状态。要启用此功能,请在任务图的根任务上将 TASK_AUTO_RETRY_ATTEMPTS 设置为大于 0 的值。

请注意,此参数必须设置为任务图的根任务。如果设置为子任务,则会返回错误。

值:030

默认:0

USER_TASK_MINIMUM_TRIGGER_INTERVAL_IN_SECONDS = num

定义任务的执行频率(以秒为单位)。如果数据更改发生的频率超过指定的最小值,则将对更改进行分组和一起处理。

即使此值设置为超过 12 小时,该任务也将每 12 小时运行一次。

值:最小值为 10,最大值为 604800

默认:30

TARGET_COMPLETION_INTERVAL = num

指定所需的任务完成时间。该参数仅适用于无服务器任务。该属性仅在任务上设置。

默认:无值。值:最小值为 1 minute,最大值为 24 hours

SERVERLESS_TASK_MIN_STATEMENT_SIZE = string

指定无服务器任务允许的最小仓库大小。该参数仅适用于无服务器任务。可在任务、架构、数据库或账户上指定该参数。优先级遵循标准参数层次结构。

默认:无值。值:最小值为 XSMALL,最大值为 XXLARGE。值与 WAREHOUSE_SIZE 值 一致。

请注意,如果同时指定 SERVERLESS_TASK_MIN_STATEMENT_SIZE 和 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE,则 SERVERLESS_TASK_MIN_STATEMENT_SIZE 必须等于或小于 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE。

SERVERLESS_TASK_MAX_STATEMENT_SIZE = string

指定无服务器任务允许的最大仓库大小。该参数仅适用于无服务器任务。可在任务、架构、数据库或账户上指定该参数。优先级遵循标准参数层次结构。

默认:无值。值:最小值为 XSMALL,最大值为 XXLARGE

请注意,如果同时指定 SERVERLESS_TASK_MIN_STATEMENT_SIZE 和 SERVERLESS_TASK_MAX_STATEMENT_SIZE,则 SERVERLESS_TASK_MIN_STATEMENT_SIZE 必须小于或等于 SERVERLESS_TASK_MAX_STATEMENT_SIZE。SERVERLESS_TASK_MAX_STATEMENT_SIZE 必须等于或大于 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE

访问控制要求

用于执行此 SQL 命令的 角色 必须至少具有以下 权限

权限

对象

备注

EXECUTE MANAGED TASK

账户

仅对依赖于无服务器计算资源来运行的任务是必需的。

CREATE TASK

架构

USAGE

仓库

仅对依赖用户管理的仓库进行运行的任务是必需的。

OWNERSHIP

任务

仅在为*现有*任务执行 CREATE OR ALTER TASK 语句时才需要。

OWNERSHIP is a special privilege on an object that is automatically granted to the role that created the object, but can also be transferred using the GRANT OWNERSHIP command to a different role by the owning role (or any role with the MANAGE GRANTS privilege).

请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。

有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色

有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述

使用说明

  • 任务使用任务所有者的权限运行。有关运行任务所需的最低权限列表,请参阅 任务安全性

    在将 SQL 语句或存储过程包含在任务定义中 之前,请以任务所有者角色的身份运行该语句或调用该存储过程,以确保角色对 SQL 或存储过程引用的对象具有所需的权限。

  • 对于无服务器任务:

    • 用于任务的无服务器计算资源的范围相当于 XSMALLXXLARGE 的仓库大小。要请求增加大小,请联系 ` Snowflake 支持部门 `_。

    • 任务图中的单个任务可以使用无服务器或用户管理的计算资源。不需要对任务图中的 所有 任务使用无服务器计算。

  • 如果任务失败并出现意外错误,您可以收到有关该错误的通知。有关配置任务错误通知的更多信息,请参阅 启用任务通知

  • 默认情况下,如果 DML 语句在未显式启动事务的情况下执行,则在语句结束时,如果成功则自动提交,如果失败则回滚。此行为称为 自动提交,使用 AUTOCOMMIT 参数进行控制。此参数 必须 设置为 TRUE。如果 AUTOCOMMIT 参数在账户级别设置为 FALSE,则对于单个任务,将该参数设置为 TRUE(使用 ALTER TASK ...SET AUTOCOMMIT = TRUE);否则,任务执行的任何 DML 语句都将失败。

  • 只有一个任务应该使用流中的数据。为同一个表创建多个流,供多个任务使用。当任务在使用 DML 语句的流中使用数据时,流将推进偏移,并且变更数据不再可供下一个任务使用。

  • 当您使用 CREATE OR REPLACE 语法时,Snowflake 会删除现有任务,并使用指定的定义重新创建它。替换任务时,请考虑以下行为:

    • 默认情况下,重新创建的任务处于暂停状态。

    • 任何正在进行的任务运行均已完成。要停止任务运行,请使用 SYSTEM$USER_TASK_CANCEL_ONGOING_EXECUTIONS 函数。

    • 如果重新创建了独立任务或根任务,则将取消该任务的下一次计划运行。

    • CREATE OR REPLACE <object> 语句是原子的。也就是说,当对象被替换时,旧对象将被删除,新对象将在单个事务中创建。

    • 具有大型定义的任务可能会导致错误。如果由于任务大小而出现错误,请尝试使用存储过程或降低任务定义的复杂性。

  • 关于元数据:

    注意

    客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段

CREATE OR ALTER TASK 使用说明

  • ALTER TASK 命令的所有限制均适用。

  • 无法使用 CREATE OR ALTER TASK 命令恢复或暂停任务。要恢复或暂停任务,请使用 ALTER TASK 命令。

  • 不支持设置或取消设置标签;然而,现有标签 会被 CREATE OR ALTER 语句所更改,而是保持不变。

示例

单一 SQL 语句

创建一个 Serverless Task,从星期天 9 AM 开始到 5 PM 结束(America/Los_Angeles 时区),每小时查询一次当前时间戳。

初始仓库大小为 XSMALL:

CREATE TASK t1
  SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles'
  USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
  AS
    SELECT CURRENT_TIMESTAMP;
Copy

与上一个示例相同,但该任务依赖于用户管理的仓库来提供用于运行的计算资源:

CREATE TASK mytask_hour
  WAREHOUSE = mywh
  SCHEDULE = 'USING CRON 0 9-17 * * SUN America/Los_Angeles'
  AS
    SELECT CURRENT_TIMESTAMP;
Copy

其他时间安排示例:

SCHEDULE 值

描述

* * * * * UTC

每一分钟。UTC 时区。

5 * * * * UTC

每 5 分钟。UTC 时区。

0 2 * * * UTC

每天凌晨 2 AM 点。UTC 时区。

0 5,17 * * * UTC

每天两次,分别在 5 AM 和 5 PM(整点)。UTC 时区。

30 2 L 6 * UTC

在 6 月最后一天的 2:30 AM。UTC 时区。

创建一个 Serverless Task,该任务每小时将当前时间戳插入表中一次。该任务会为运行任务的会话设置 TIMESTAMP_INPUT_FORMAT 参数。此会话参数指定插入时间戳的格式:

CREATE TASK t1
  SCHEDULE = '60 MINUTE'
  TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
  USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
  AS
    INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
Copy

创建一个任务,该任务每 5 分钟将当前时间戳插入表中一次:

CREATE TASK mytask_minute
  WAREHOUSE = mywh
  SCHEDULE = '5 MINUTE'
  AS
    INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
Copy

创建一个任务,该任务每 5 分钟将流中 INSERT 操作的变更跟踪数据插入表中一次。该任务使用 SYSTEM$STREAM_HAS_DATA 函数轮询流以确定是否存在变更数据,如果结果为 FALSE,则跳过当前运行:

CREATE TASK mytask1
  WAREHOUSE = mywh
  SCHEDULE = '5 minute'
  WHEN
    SYSTEM$STREAM_HAS_DATA('MYSTREAM')
  AS
    INSERT INTO mytable1(id,name) SELECT id, name FROM mystream WHERE METADATA$ACTION = 'INSERT';
Copy

在任务图中创建无服务器子任务,并添加多个前置任务。子任务仅在所有指定的前置任务成功完成自己的运行后运行。

假设任务图的根任务是 task1,并且 task2task3task4task1 的子任务。此示例将子任务 task5 添加到任务图中,并将 task2task3task4 指定为前置任务:

-- Create task5 and specify task2, task3, task4 as predecessors tasks.
-- The new task is a serverless task that inserts the current timestamp into a table column.
CREATE TASK task5
  AFTER task2, task3, task4
AS
  INSERT INTO t1(ts) VALUES(CURRENT_TIMESTAMP);
Copy

存储过程

创建一个名为 my_copy_task 的任务,该任务每小时调用一次存储过程,以将数据从 mytable 表卸载到名为 mystage 的暂存区(使用 COPY INTO <location>):

-- Create a stored procedure that unloads data from a table
-- The COPY statement in the stored procedure unloads data to files in a path identified by epoch time (using the Date.now() method)
CREATE OR REPLACE PROCEDURE my_unload_sp()
  returns string not null
  language javascript
  AS
    $$
      var my_sql_command = ""
      var my_sql_command = my_sql_command.concat("copy into @mystage","/",Date.now(),"/"," from mytable overwrite=true;");
      var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
      var result_set1 = statement1.execute();
    return my_sql_command; // Statement returned for info/debug purposes
    $$;

-- Create a task that calls the stored procedure every hour
CREATE TASK my_copy_task
  WAREHOUSE = mywh
  SCHEDULE = '60 minute'
  AS
    CALL my_unload_sp();
Copy

使用 SnowSQL 的多个 SQL 语句

创建一个执行多个 SQL 语句的任务。在以下示例中,任务修改会话的 TIMESTAMP_OUTPUT_FORMAT,然后查询 CURRENT_TIMESTAMP 函数。

备注

任务定义中的 SQL 代码包含多个语句。要执行 CREATE TASK 语句,必须临时设置分号 以外 的字符作为 SQL 语句的分隔符;否则,CREATE TASK 语句将返回用户错误。更改 SnowSQL 中 SQL 分隔符的命令是 !set sql_delimiter = <character>

!set sql_delimiter=/
CREATE OR REPLACE TASK test_logging
  USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
  SCHEDULE = 'USING CRON  0 * * * * America/Los_Angeles'
  AS
    BEGIN
      ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
      SELECT CURRENT_TIMESTAMP;
    END;/
!set sql_delimiter=";"
Copy

使用 Snowflake Scripting 的过程逻辑

创建一个声明变量、使用变量且每 2 分钟返回一次变量值的任务:

CREATE TASK t1
  USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
  SCHEDULE = '2 minute'
  AS
    EXECUTE IMMEDIATE
    $$
    DECLARE
      radius_of_circle float;
      area_of_circle float;
    BEGIN
      radius_of_circle := 3;
      area_of_circle := pi() * radius_of_circle * radius_of_circle;
      return area_of_circle;
    END;
    $$;
Copy

具有配置的根任务

创建一个指定配置的任务,然后读取该配置。

CREATE OR REPLACE TASK root_task_with_config
  WAREHOUSE=mywarehouse
  SCHEDULE='10 m'
  CONFIG=$${"output_dir": "/temp/test_directory/", "learning_rate": 0.1}$$
  AS
    BEGIN
      LET OUTPUT_DIR STRING := SYSTEM$GET_TASK_GRAPH_CONFIG('output_dir')::string;
      LET LEARNING_RATE DECIMAL := SYSTEM$GET_TASK_GRAPH_CONFIG('learning_rate')::DECIMAL;
    ...
    END;
Copy

终结器任务

创建与任务图的根任务关联的终结器任务,该任务在任务完成后发送电子邮件警报。有关终结器任务的更多信息,请参阅 任务图的释放和清理

CREATE TASK finalize_task
  WAREHOUSE = my_warehouse
  FINALIZE = my_root_task
  AS
    CALL SYSTEM$SEND_EMAIL(
      'my_email_int',
      'first.last@example.com, first2.last2@example.com',
      'Email Alert: Task A has finished.',
      'Task A has successfully finished.\nStart Time: 10:10:32\nEnd Time: 12:15:45\nTotal Records Processed: 115678'
    );
Copy

触发任务

创建一个与数据流相关联的触发任务,即每次数据流中有新数据时,就将指定数据流中的数据插入表中。有关更多信息,请参阅 触发任务

CREATE TASK triggeredTask  WAREHOUSE = my_warehouse
  WHEN system$stream_has_data('my_stream')
  AS
    INSERT INTO my_downstream_table
    SELECT * FROM my_stream;

ALTER TASK triggeredTask RESUME;
Copy

使用 CREATE OR ALTER TASK 命令创建并更改简单任务

创建一个任务 my_task,每小时在仓库 my_warehouse 中执行一次:

CREATE OR ALTER TASK my_task
  WAREHOUSE = my_warehouse
  SCHEDULE = '60 minute'
  AS
    SELECT PI();
Copy

更改任务 my_task 以在任务 my_other_task 后执行,并更新任务定义:

CREATE OR ALTER TASK my_task
  WAREHOUSE = regress
  AFTER my_other_task
  AS
    SELECT 2 * PI();
Copy
语言: 中文