カテゴリ:

データパイプライン DDL

CREATE TASK

現在/指定されたスキーマに新しいタスクを作成するか、既存のタスクを置き換えます。

このコマンドは、次のバリアントもサポートしています。

  • CREATE TASK ... CLONE (既存のタスクのクローンを作成)

こちらもご参照ください。

ALTER TASKDROP TASKSHOW TASKSDESCRIBE TASK

このトピックの内容:

構文

CREATE [ OR REPLACE ] TASK [ IF NOT EXISTS ] <name>
  [ { WAREHOUSE = <string> } | { USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = <string> } ]
  [ SCHEDULE = '{ <num> MINUTE | USING CRON <expr> <time_zone> }' ]
  [ 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> ]
  [ COPY GRANTS ]
  [ COMMENT = '<string_literal>' ]
  [ AFTER <string> [ , <string> , ... ] ]
[ WHEN <boolean_expr> ]
AS
  <sql>

バリアント構文

CREATE TASK ... CLONE

同じパラメーター値で新しいタスクを作成します。

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

詳細については、 CREATE <オブジェクト> ... CLONE をご参照ください。

必須パラメーター

name

タスクの識別子(名前)を指定する文字列。タスクが作成されるスキーマに対して一意である必要があります。

また、識別子はアルファベット文字で始まる必要があり、識別子文字列全体が二重引用符で囲まれていない限り、スペースや特殊文字を含めることはできません(例: "My object")。二重引用符で囲まれた識別子も大文字と小文字が区別されます。

詳細については、 識別子の要件 をご参照ください。

sql

次のいずれかを使用します。

  • 単一の SQL ステートメント

  • ストアドプロシージャへの呼び出し

  • Snowflakeスクリプト を使用した手続き型ロジック

    現在、Snowsightと従来のウェブインターフェイスでは、Snowflakeスクリプトを使用するためのタスクの作成または変更をサポートしていないことに注意してください。代わりに、 SnowSQL または別のコマンドラインクライアントを使用してください。

SQL コードは、タスク実行時に実行されます。

注釈

  • SQL コードは、それ自体で実行できる 必要があります。タスクを作成する に、 sql が期待どおりに実行されることを確認することを強くお勧めします。タスクは、すでに徹底的にテストされている SQL ステートメントとストアドプロシージャを自動化することを目的としています。

  • サーバーレスタスクは、次のオブジェクト型を呼び出すことはできません。

    • JavaまたはPythonコードを含むUDFs(ユーザー定義関数)。

    • Scalaで(Snowparkを使用して)作成された、またはJavaまたはPythonコードを含むUDFsを呼び出すストアドプロシージャ。

オプションのパラメーター

WAREHOUSE = string または . USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string

WAREHOUSE = string

タスク実行用のコンピューティングリソースを提供する仮想ウェアハウスを指定します。

このタスクの実行にSnowflakeが管理するコンピューティングリソースを使用するには、このパラメーターを省略します。サーバーレスタスクとも呼ばれるこれらのリソースは、各ワークロードの必要に応じて、Snowflakeにより自動でサイズ変更、およびスケールアップまたはスケールダウンされます。タスクにスケジュールが指定されると、Snowflakeはリソースサイズを調整して、指定された時間枠内にタスクの将来の実行を完了します。タスクの初期ウェアハウスサイズを指定するには、 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string パラメーターを設定します。

USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = string

サーバーレスタスクにのみ適用されます。

Snowflakeが理想的なサイズを決定するためにタスク履歴を使用できるようになる前に、タスクの最初の実行にプロビジョニングするコンピューティングリソースのサイズを指定します。タスクが数回の実行を正常に完了すると、Snowflakeはこのパラメーター設定を無視します。

特定のタスクでタスク履歴が利用できない場合、コンピューティングリソースはこの初期サイズに戻ることに注意してください。

注釈

WAREHOUSE = string パラメーター値が指定されている場合は、このパラメーターを設定するとユーザーエラーが発生します。

サイズは、 SMALLMEDIUMLARGE など、ウェアハウスの作成時に使用可能なコンピューティングリソース(CREATE WAREHOUSE を使用)と同等です。パラメーターでサポートされる最大サイズは XXLARGE です。パラメーターを省略した場合、タスクの最初の実行はMサイズ(MEDIUM)のウェアハウスを使用して実行されます。

初期サイズは、タスクが作成された 、正常に1度実行される であれば変更できます(ALTER TASK を使用)。このタスクの最初の実行を開始した後にパラメーターを変更しても、現在または将来のタスク実行のコンピューティングリソースには影響しません。

タスクを一時停止および再開しても、コンピューティングリソースのサイズ設定に使用されたタスク履歴は削除されないことに注意してください。タスク履歴は、タスクが再作成された場合にのみ削除されます(CREATE OR REPLACE TASK 構文を使用)。

このパラメーターの詳細については、 USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE をご参照ください。

SCHEDULE ...

タスクを定期的に実行するスケジュールを指定します。

注釈

  • スケジュールは、スタンドアロンタスクまたはタスクの DAG 内のルートタスクに対して定義する 必要があります。それ以外の場合、タスクは EXECUTE TASK を使用して手動で実行された場合にのみ実行されます。

  • DAGの子タスクにスケジュールを指定することは できません

  • USING CRON expr time_zone

    タスクを定期的に実行するためのcron式とタイムゾーンを指定します。標準のcronユーティリティ構文のサブセットをサポートします。

    タイムゾーンのリストについては、 tzデータベースタイムゾーンのリスト (Wikipedia)をご参照ください。

    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)
    # | | | | |
    # | | | | |
      * * * * *
    

    次の特殊文字がサポートされています。

    *

    ワイルドカード。フィールドのオカレンスを指定します。

    L

    「最後」の略。曜日フィールドで使用すると、特定の月の「最後の金曜日」(「5L」)などの構造を指定できます。月の日フィールドでは、月の最後の日を指定します。

    /n

    特定の時間単位の nth インスタンスを示します。時間の各クォンタムは独立して計算されます。たとえば、月フィールドに 4/3 が指定されている場合、タスクは4月、7月、および10月にスケジュールされます(つまり、年の4番目の月から始まる3か月ごと)。その後も同じスケジュールが維持されます。つまり、タスクは1月(10月の実行から3か月後)に実行されるようにスケジュールされては いません

    注釈

    • cron式は現在、指定されたタイムゾーンに対してのみ評価します。アカウントの TIMEZONE パラメーター値を変更(またはユーザーレベルまたはセッションレベルで値を設定)しても、タスクのタイムゾーンは 変更されません

    • cron式は、タスクのすべての 有効 実行時間を定義します。Snowflakeは、このスケジュールに基づいてタスクを実行しようとします。ただし、次の有効な実行時間が始まる前に前の実行が完了していない場合、有効な実行時間はスキップされます。

    • 特定の月と曜日の両方がcron式に含まれている場合、タスクは月または曜日の いずれか を満たす日にスケジュールされます。例えば、 SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC' は、月の10日から20日、およびそれらの日付以外の火曜日または木曜日に、 0AM でタスクをスケジュールします。

    • cronでの時間の最小粒度は分です。cron式で定義された分の間にタスクが再開された場合、最初にスケジュールされたタスクの実行は、cron式のインスタンスの次回発生です。たとえば、毎日午前0時(USING CRON 0 0 * * *)に実行するようにスケジュールされたタスクが、午前0時+5秒(00:00:05)に再開される場合、最初のタスクの実行は次の午前0時にスケジュールされます。

  • num MINUTE

    タスクの実行間に挿入される待機時間の間隔(分単位)を指定します。正の整数のみを受け入れます。

    num M 構文もサポートしています。

    あいまいさを避けるために、次の場合には 基本間隔時間 が設定されます。

    基本間隔時間は、現在のクロック時間から間隔カウンターを開始します。例えば、 10 の INTERVAL 値が設定され、タスクが9:03 AM で有効になっている場合、タスクは9:13 AM、9:23 AMというふうに実行されます。絶対精度を確保するために最善を尽くしますが、保証されるのは、設定間隔が発生する 前に タスクが実行されないようにすることのみです(例: 現在の例では、タスクは最初9:14 AM に実行できますが、9:12 AM には決して実行されません)。

    注釈

    サポートされる最大値は 11520 (8日間)です。 num MINUTE の値がこれよりも大きいタスクは実行されません。

ALLOW_OVERLAPPING_EXECUTION = TRUE | FALSE

DAGの複数のインスタンスを同時に実行できるようにするかどうかを指定します。

注釈

このパラメーターは、ルートタスクでのみ設定できます。この設定は、DAG内のすべてのタスクに適用されます。

このパラメーターはスタンドアロンタスクに設定できますが、タスクの動作には影響しません。Snowflakeは、スタンドアロンタスクの1つのインスタンスのみが特定の時間に実行されていることを確認します。

  • TRUE はルートタスクの1つのインスタンスのみが特定の時間に実行されていることを確認します。次の実行スケジュールが開始する際に、ルートタスクがまだ実行されている場合、そのスケジュールされた時間はスキップされます。この保証は、子タスクには適用されません。子タスクの現在の実行がまだ動作している間にルートタスクの次のスケジュールが実行されると、DAGの別のインスタンスが開始されます。

  • FALSE は特定のDAGの1つのインスタンスのみが一度に実行できるようにします。ルートタスクの次の実行は、DAG内のすべての子タスクの実行が終了した後にのみスケジュールされます。これは、DAG内のすべてのタスクを実行するために必要な累積時間がルートタスクの定義で設定された明示的なスケジュールされた時間を超える場合、DAGの少なくとも1つの実行がスキップされることを意味します。

デフォルト: FALSE

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

タスクの実行時にセッションに設定するセッションパラメーターのコンマ区切りリストを指定します。タスクはすべてのセッションパラメーターをサポートします。完全なリストについては、 セッションパラメーター をご参照ください。

USER_TASK_TIMEOUT_MS = num

タスクがタイムアウトするまでの1回の実行の制限時間(ミリ秒単位)を指定します。

注釈

  • タスクの制限時間を大幅に増やす前に、タスクによって開始された SQL ステートメントを最適化できるか(ステートメントを書き換えるか、ストアドプロシージャを使用して)、ウェアハウスのサイズを増やす必要があるかどうかを検討してください。

  • 状況によっては、パラメーターSTATEMENT_TIMEOUT_IN_SECONDSの優先順位がUSER_TASK_TIMEOUT_MSよりも高くなります。詳細については、 STATEMENT_TIMEOUT_IN_SECONDS をご参照ください。

このパラメーターの詳細については、 USER_TASK_TIMEOUT_MS をご参照ください。

値: 0 - 86400000 (1日)。

デフォルト: 3600000 (1時間)

SUSPEND_TASK_AFTER_NUM_FAILURES = num

現在のタスクが自動的に中断されるまでに連続して失敗したタスク実行の回数を指定します。失敗したタスク実行には、タスク本体の SQL コードがユーザーエラーを生成するかタイムアウトになった実行が含まれます。スキップ、キャンセル、またはシステムエラーが原因で失敗したタスク実行は不確定と見なされ、失敗したタスク実行の数には含まれません。

スタンドアロンタスクまたは DAG のルートタスクにパラメーターを設定します。パラメータが 0 より大きい値に設定されている場合、次の動作がスタンドアロンタスクまたは DAG の実行に適用されます。

  • スタンドアロンタスクは、指定された数の連続したタスクの実行が失敗するかタイムアウトになると、自動的に中断します。

  • ルートタスクは、DAG の 任意 の単一タスクの実行が、連続した実行で指定された回数失敗するかタイムアウトした後、自動的に中断します。

この設定は、Snowflakeが管理するコンピューティングリソース(サーバーレスコンピューティングモデル)またはユーザー管理のコンピューティングリソース(仮想ウェアハウス)に依存するタスクに適用されます。

このパラメーターの詳細については、 SUSPEND_TASK_AFTER_NUM_FAILURES をご参照ください。

値: 0 - 上限なし。

デフォルト: 0 (自動中断なし)

ERROR_INTEGRATION = 'integration_name'

Amazon Simple Notification Service(SNS)を使用して、エラー通知を送信するようにタスクを設定する場合にのみ必要です。 Amazon SNS との通信に使用される通知統合の名前を指定します。詳細については、 タスクのエラー通知の有効化 をご参照ください。

COPY GRANTS

次の CREATE TASK バリアントのいずれかを使用して新しいタスクが作成されるときに、元のタスクからのアクセス許可を保持することを指定します。

  • CREATE OR REPLACE TASK

  • CREATE TASK ... CLONE

このパラメーターは、 OWNERSHIP を 除く すべての許可を既存のタスクから新しいタスクにコピーします。デフォルトでは、 CREATE TASK コマンドを実行するロールが新しいタスクを所有します。

ノート:

  • CREATE TASK ステートメントが複数のタスク(例: create or replace task t1 clone t2;)を参照している場合、 COPY GRANTS 句は置換されるタスクを優先します。

  • 置換タスクの SHOW GRANTS 出力には、コピーされた権限の被付与者が、 CREATE TASK ステートメントを実行したロールとして、ステートメントが実行されたときの現在のタイムスタンプとともにリストされます。

  • 許可をコピーする操作は、 CREATE TASK コマンドで(つまり、同じトランザクション内で)アトミックに発生します。

注釈

このパラメーターは現在サポートされていません。

COMMENT = 'string_literal'

タスクのコメントを指定します。

デフォルト: 値なし

AFTER string [ , string , ... ]

現在のタスクに対する1つ以上の先行タスクを指定します。このオプションを使用して、 タスクの DAG を作成するか、このタスクを既存の DAG に追加します。DAG は、スケジュールされたルートタスクで始まり、依存関係によって相互にリンクされる一連のタスクです。

DAG の構造は、そのすべてのコンポーネントタスクが作成された後に定義できることに注意してください。 ALTER TASK ... ADD AFTER ステートメントを実行して、計画された DAG の各タスクの先行タスクを指定します。

タスクは、先行タスクが実行を正常に終了した後(短い遅延の後)に実行されます。

注釈

  • ルートタスクには、定義済みのスケジュールが必要です。各子タスクは、タスクをリンクするために、1つ以上の定義済みの先行タスク(つまり、 AFTER パラメーターを使用して指定されたタスク)にする必要があります。

  • 単一のタスクは、100先行タスクと100子タスクに制限されています。さらに、DAGは再開状態または一時停止状態のいずれかにおいて、 合計l で最大1000タスク(ルートタスクを含む)に制限されます。

  • アカウントは現在、最大10000再開タスクに制限されています。

  • DAGのすべてのタスクには同じタスク所有者が必要です(つまり、単一のロールにはDAG内のすべてのタスクに対する OWNERSHIP 権限が必要です)。

  • DAGのすべてのタスクは、同じスキーマに存在する必要があります。

  • ルートタスクは、 任意の タスクが再作成される(CREATE OR REPLACE TASK 構文を使用)、または子タスクが追加される(CREATE TASK ... AFTER または ALTER TASK ... ADD AFTER を使用)か削除される(ALTER TASK ... REMOVE AFTER)前に一時停止する必要があります。

  • DAG内のタスクのいずれかがクローンされると、タスクをクローンするロールがデフォルトでクローンの所有者になります。

    • 元のタスクの所有者がクローンを作成すると、タスククローンはタスクと先行タスクの間のリンクを保持します。これは、同じ先行タスクが元のタスクとタスククローンの両方をトリガーすることを意味します。

    • 別のロールがクローンを作成する場合、タスククローンはスケジュールを持てますが、先行タスクは持てません。

  • 現在の制限:

    • Snowflakeは、定義されたスケジュールを持つタスクの最大1つのインスタンスが特定の時間に実行されることを保証します。ただし、定義済みの先行タスクを持つタスクに対して同じ保証を提供することはできません。

WHEN boolean_expr

ブール SQL 式を指定します。 AND/OR で結合された複数の条件がサポートされています。( SCHEDULE または AFTER 設定に基づいて)タスクがトリガーされると、式の条件を検証して、実行するかどうかを決定します。式の条件が 満たされない 場合、タスクは現在の実行をスキップします。このタスクを先行タスクとして識別するタスクも実行されません。

SYSTEM$STREAM_HAS_DATA は、 SQL 式での評価がサポートされている唯一の関数です。この関数は、指定されたストリームに変更追跡データが含まれているかどうかを示します。タスクは、現在の実行を開始する前に、指定されたストリームに変更データが含まれているかどうかを評価します。結果が FALSE の場合、タスクは実行されません。この関数はフォールスネガティブ(つまり、ストリームに変更データが含まれている場合でもfalse値を返す)を回避するように設計されています。ただし、この関数は、誤検知の回避を保証するものではありません(つまり、ストリームに変更データが含まれていない場合にtrue値を返します)。

WHEN 式の条件の検証にコンピューティングリソースは必要ありません。代わりに、検証はクラウドサービスレイヤーで処理されます。タスクが WHEN 条件を評価して実行しないたびに、わずかな料金が発生します。タスクが実行されるまで、タスクがトリガーされるたびに料金が累積されます。その時点で、料金はSnowflakeクレジットに変換され、タスク実行のコンピューティングリソース使用量に追加されます。

一般に、条件を検証するための計算時間は、タスクの実行時間と比較して重要ではありません。ベストプラクティスとして、スケジュールされたタスクと実際のタスクの実行を可能な限り一致させます。実際のタスク実行と大幅に同期していないタスクスケジュールは避けてください。たとえば、データがおよそ24時間ごとにストリームのあるテーブルに挿入される場合、毎分ストリームデータをチェックするタスクはスケジュールしないでください。各実行で WHEN 式を検証するための料金は、通常は重要ではありませんが、料金は累積されます。

コンピューティングリソース1日あたりの使用量の10%クォータ を下回るクラウドサービス1日あたりの消費量は、クラウドサービスの料金に累積されません。

アクセス制御の要件

この SQL コマンドの実行に使用される ロール には、少なくとも次の 権限 が必要です。

権限

オブジェクト

メモ

EXECUTE MANAGED TASK

アカウント

実行のためにSnowflake管理のコンピューティングリソースに依存するタスク(サーバーレスタスク)にのみ必要です。

CREATE TASK

スキーマ

USAGE

ウェアハウス

実行のためにユーザー管理のウェアハウスに依存するタスクにのみ必要です。

スキーマ内の任意のオブジェクトを操作するには、親データベースとスキーマに対する USAGE 権限も必要であることに注意してください。

指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。

セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 Snowflakeのアクセス制御 をご参照ください。

使用上の注意

  • タスクは、タスク所有者に付与された権限(つまり、タスクに対する OWNERSHIP 権限を持つロール)を使用して実行されます。タスクを実行するために最低限必要な権限のリストについては、 タスクセキュリティ をご参照ください。

    タスク定義に含める に、 SQL ステートメントを実行するか、ストアドプロシージャを呼び出すことをお勧めします。タスク所有者のロールとしてこのステップを完了し、そのロールが SQL によって参照される任意のオブジェクトに対して必要な権限すべてを持っていることを確認します。

  • タスクの個々の実行に対するコンピューティングリソースは、Snowflake(つまり、サーバーレスタスク)またはユーザー指定の仮想ウェアハウスの いずれか によって管理されます。サーバーレスタスクを使用するには、 CREATE TASK ステートメントの WAREHOUSE = string パラメーターを省略します。

    • タスクのSnowflake管理リソースは、ウェアハウスサイズで XSMALL から XXLARGE に相当する範囲になります。この範囲にさらに大きなウェアハウスサイズを含める場合は、 Snowflakeサポート に連絡してサイズの拡大をリクエストしてください。

    • サーバーレスモデルは、DAG内の1つ以上のタスクに対して有効にできます。DAG内にある個々のタスクの実行は、Snowflakeまたはユーザーが管理するコンピューティングリソースのいずれかに依存します。DAG内の すべての タスクに対してこのサーバーレスコンピューティングモデルを有効にする必要はありません。

  • タスクを作成した後、タスク定義で指定されたパラメーターに基づいてタスクが実行される前に、 ALTER TASK ... RESUME を実行する 必要 があります。アカウントは現在、最大10000再開タスクに制限されていることに注意してください。

    さらに、タスクがクローンされると、クローンされたタスクの実行はデフォルトで一時停止されるため、同じコマンドを使用して明示的に有効にする必要があります。

  • デフォルトでは、トランザクションを明示的に開始せずに実行された DML ステートメントは、成功時には自動的にコミットされ、失敗時にはステートメントの最後でロールバックされます。この動作は 自動コミット と呼ばれ、 AUTOCOMMIT パラメーターで制御されます。このパラメーターは TRUE に設定する 必要があります。アカウントレベルで AUTOCOMMIT パラメーターが FALSE に設定されている場合、個々のタスクのパラメーターを TRUE に設定します( ALTER TASK ... SET AUTOCOMMIT = TRUEを使用)。それ以外では、タスクによって実行されるどのような DML ステートメントも失敗します。

  • 単一のテーブルストリームから変更データを消費する複数のタスクは、異なるデルタを取得します。タスクが DML ステートメントを使用してストリーム内の変更データを消費すると、ストリームはオフセットを進めます。変更データは、次に消費するタスクで使用できなくなります。現在は、単一のタスクのみがストリームの変更データを消費することをお勧めします。同じテーブルに対して複数のストリームを作成し、異なるタスクで使用できます。

  • CREATE OR REPLACE 構文を使用すると、既存のタスクが削除され、指定された定義を使用して再作成されます。次の動作に注意してください。

    • 再作成されたタスクは、デフォルトで一時停止されます。

    • タスクのいずれかの現在の実行(つまり、 TASK_HISTORY 出力で EXECUTING 状態の実行)が完了します。指定されたタスクの実行を中止するには、 SYSTEM$USER_TASK_CANCEL_ONGOING_EXECUTIONS 関数を実行します。

    • スタンドアロンまたはルートタスクが再作成されると、次にスケジュールされているタスクの実行がキャンセルされます。

    • CREATE OR REPLACE <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、古いオブジェクトの削除と新しいオブジェクトの作成が1つのトランザクションで処理されます。

  • メタデータについて:

    注意

    Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。

単一の SQL ステートメント

日曜日(米国/ロサンゼルスタイムゾーン)の9 AM から5 PM までの1時間ごとに、現在のタイムスタンプをクエリするサーバーレスタスクを作成します。

初期のウェアハウスサイズは 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;

前の例と同じですが、タスクはユーザー管理のウェアハウスに依存して、実行用のコンピューティングリソースを提供します。

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

追加のタイミング例:

SCHEDULE 値

説明

* * * * * UTC

毎分。UTC タイムゾーン。

0 2 * * * UTC

毎晩2 AM。UTC タイムゾーン。

0 5,17 * * * UTC

毎日2回、5 AM と5 PM (時間の一番上)。UTC タイムゾーン。

30 2 L 6 * UTC

6月、月末の2:30 AM。UTC タイムゾーン。

1時間ごとに現在のタイムスタンプをテーブルに挿入するサーバーレスタスクを作成します。タスクは、タスクが実行されるセッションの 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);

5分ごとに現在のタイムスタンプをテーブルに挿入するタスクを作成します。

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

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';

DAGにサーバーレスの子タスクを作成し、複数の先行タスクを追加します。子タスクは、指定されたすべての先行タスクが独自の実行を正常に完了した後にのみ実行されます。

DAGのルートタスクが task1 であり、 task2task3、および task4task1 の子タスクであるとします。この例では、子タスク task5 をDAGに追加し、 task2task3、および task4 を先行タスクとして指定します。

-- 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);

ストアドプロシージャ

ストアドプロシージャを呼び出す my_copy_task という名前のタスクを作成して、1時間ごとに mytable テーブルから名前付き mystage ステージにデータをアンロードします( COPY INTO <場所> を使用)。

-- 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();

SnowSQL を使用した複数の SQL ステートメント

複数の SQL ステートメントを実行するタスクを作成します。この例では、タスクはセッションの TIMESTAMP_OUTPUT_FORMAT を変更してから、 CURRENT_TIMESTAMP 関数をクエリします。

注釈

タスク定義の SQL コードには、複数のステートメントが含まれています。CREATE TASK ステートメントを実行するには、一時的に SQL ステートメントの区切り文字としてセミコロン 以外 の文字を設定する必要があります。そうしないと、 CREATE TASK ステートメントはユーザーエラーを返します。SnowSQL の SQL 区切り文字を変更するコマンドは !set sql_delimiter = <文字> です。

!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=";"

Snowflakeスクリプトを使用した手続き型ロジック

変数を宣言し、変数を使用し、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;
  $$;
最上部に戻る