一般的なデータ開発シナリオでは、さまざまなタイプのノードのコードは、時間の経過とともに変更される場合があります。 要件の変更や時刻経過などに伴い、パラメーターの値 (日時など) を動的に変更しなければなりません。 この場合、DataWorks の設定機能であるスケジューリングパラメーターが使用できます。
関連するパラメーターを設定すると、自動的にトリガーされたノードが必要なデータを取得するために、自動的にコードをパーシングします。 DataWorks で設定できるパラメーターは、システムパラメーターとカスタムパラメーターに分類されます。 カスタムパラメーターを使用することを推奨します。
パラメータータイプ
- コード内でシステムパラメーターを直接参照できます。
- カスタムパラメーターを使用するには、パラメーターの値として変数への代入を記述し、コード内では変数名を参照します。
パラメータータイプ | 適用範囲 | 設定方法 | パラメーター値 | 例 |
---|---|---|---|---|
システムパラメーター:bdp.system.bizdate および bdp.system.cyctime を含みます。 | すべてのノード | コード内で、${bdp.system.bizdate} および ${bdp.system.cyctime} のように参照します。 | なし | なし |
非システムパラメーター:カスタムパラメーター (推奨) | ODPS SQL ノードおよび sync ノード | コード内で、${key1} および ${key2} のように参照します。 | key1=value1 key2=value2 |
|
PyODPS ノード | args という名前の辞書オブジェクトをグローバル変数に追加:args=['key1'] args=['key2'] 。
|
|||
Shell ノード | コード内で、$1, $2, ... のように参照します。 | value1 value2 |
|
システムパラメーター
- ${bdp.system.cyctime}:インスタンスのスケジューリングされた実行時刻。 デフォルトの形式:yyyymmddhh24miss。
このパラメーターは、スケジューリングされた時刻の時と分を指定できます。 このパラメーターの値は、cyctime パラメーターと同じです。
- ${bdp.system.bizdate}:インスタンスによって分析されたデータのタイムスタンプ。 デフォルトの形式:yyyymmdd。 デフォルトのデータタイムスタンプは、スケジューリングされた時刻の 1 日前です。 このパラメーターの値は、bizdate パラメーターと同じです。
スケジューリングされた時刻とデータタイムスタンプの計算式は、スケジューリングされた時刻 = データタイムスタンプ + 1
です。
次の図では、ODPS SQL ノードのシステムパラメーターとカスタムパラメーターに値を代入する方法と、コード内でパラメーターを参照する方法について説明しています。 左側のセクションは、コードコンパイルエリア、右側はパラメーター設定エリアとなっています。
- 変数名=パラメーター の形式でパラメーターを設定する場合、イコール記号 (=) の両側に空白文字を追加しないでください。 たとえば、
bizdate=$bizdate
のように入力します。 - パラメーターが複数ある場合は、空白文字で区切ります。 パラメーター値に空白文字を入れたい場合、パラメーター値を複数の変数へ分割し、個別に値を代入します。 コード内では、複数の変数を空白文字で区切ることができます。
たとえば、
bizdate=$bizdate datetime=${yyyymmdd}
のように入力します。
カスタムパラメーター
DataWorks では、次のパラメーターを使用することができます。定数パラメーター、組み込みパラメーター (bizdate および cyctime)、${...}、および $[...] です。
次のセクションでは、ODPS SQL ノードを例に、ノード設定タブの [プロパティ] タブでノード用のカスタムパラメーターへ値を代入する方法を説明します。
パラメーター | サンプルコード | 代入された値 | 置き換えられた値 |
---|---|---|---|
${yyyymmdd} | pt=${datetime1} |
datetime1=${yyyymmdd} |
datetime1=20191031 |
$[yyyymmddhh24miss] | pt=${datetime2} |
datetime2=$[yyyymmddhh24miss] |
datetime2=201911010000 |
$bizdate:データのタイムスタンプ。 | pt=${datetime3} |
datetime3=$bizdate |
datetime3=20191031 |
$cyctime:スケジューリングされた時刻。精度は秒単位です。 | pt=${datetime4} |
datetime4=$cyctime |
datetime4=201911010000 |
$gmtdate:予定日付。精度は日単位です。 | pt=${datetime5} |
datetime5=$gmtdate |
datetime5=20191101 |
$bizmonth:データタイムスタンプの月。 | pt=${datetime6} |
datetime6=$bizmonth |
|
- 組み込みパラメーター
パラメーター 説明 $jobid ノードが属しているワークフローの ID。 例: jobid=$jobid
$nodeid ノードの ID。 例: nodeid=$nodeid
$taskid ノードのインスタンス ID。 例: taskid=$taskid
$bizdate yyyymmdd 形式のデータタイムスタンプ。 このパラメーターは広く使用されます。 デフォルトでは、このパラメーターの値は、ノードが実行される予定日時の 1 日前です。
$cyctime yyyymmddhh24miss 形式のノード実行予定日時。 ノードに日ごとの予定日時が設定されていない場合、$cyctime はその日の 00:00 に設定されます。 時間の精度は秒単位です。 このパラメーターは、通常時間単位、または分単位にスケジューリングされたノードに使用します。 例:
cyctime=$cyctime
$gmtdate yyyymmdd 形式の現在の日付。 デフォルトでは、このパラメーターは現在の日付です。 遡及的なデータ生成中、入力値はデータタイムスタンプ + 1 日です。
$bizmonth yyyymm 形式のデータタイムスタンプの月。 - データタイムスタンプの月が今月である場合、$bizmonth の値は、データタイムスタンプの月から 1 引いたものです。
- それ以外の場合では、$bizmonth の値はデータタイムスタンプの月となります。
- データタイムスタンプの月が今月である場合、$bizmonth の値は、データタイムスタンプの月から 1 引いたものです。
- ${...} カスタムパラメーター
$bizdate の値に基づいて時間形式をカスタマイズします。yyyy は 4 桁の年、yy は 2 桁の年、mm は月、dd は日を表します。 これらのパラメーターは自由に組み合わせることができます。たとえば、${yyyy}、${yyyymm}、${yyyymmdd}、${yyyy-mm-dd} です。
$bizdate の精度は、日単位です。 したがって、${...} では年、月、日のみを指定することができます。
次の表では、他の時間間隔を $bizdate に基づいて指定する方法を説明します。時間間隔 式 N 年後 ${yyyy+N} N 年前 ${yyyy-N} N か月後 ${yyyymm+N} N か月前 ${yyyymm-N} N 週間後 ${yyyymmdd+7*N} N 週間前 ${yyyymmdd-7*N} N 日後 ${yyyymmdd+N} N 日前 ${yyyymmdd-N} 指定日から N 日後 ${yyyymmdd+N} 指定日から N 日前 ${yyyymmdd-N} 指定した年から N 年後 (形式は yyyy) ${yyyy+N} 指定した年より N 年前 (形式は yyyy) ${yyyy-N} 指定した年より N 年後 (形式は yy) ${yy+N} 指定した年より N 年前 (形式は yy) ${yy-N} - $[...] カスタムパラメーター
$cyctime の値に基づいて時間形式をカスタマイズします。yyyy は4桁の年、yy は 2 桁の年、mm は月、dd は日を表します。hh24 は時間を 24 時間表記で表し、hh は12 時間表記で表します。mi は分、ss は秒を表します。 これらのパラメーターは自由に組み合わせることができます。たとえば、$[yyyymmdd]、$[yyyy-mm-dd]、$[hh24miss]、$[hh24:mi:ss]、$[yyyymmddhh24miss] です。
$cyctime の精度は秒単位です。 したがって、$[...] は時、分、秒を指定することができます。
$cyctime の精度は秒単位です。 したがって、$[...] は時、分、秒を指定することができます。
次の表では、他の時間間隔を$cyctime に基づいて指定する方法を説明します。時間間隔 式 N 年後 $[add_months(yyyymmdd,12*N)] N 年前 $[add_months(yyyymmdd,-12*N)] N か月後 $[add_months(yyyymmdd,N)] N か月前 $[add_months(yyyymmdd,-N)] N 週間後 $[yyyymmdd+7*N] N 週間前 $[yyyymmdd-7*N] N 日後 $[yyyymmdd-N] N 日前 $[yyyymmdd-N] N 時間後 $[hh24miss+N/24] N 時間前 $[hh24miss-N/24] N 分後 $[hh24miss+N/24/60] N 分前 $[hh24miss-N/24/60]
$[yyyymmddhh24miss] は、日 (yyyymmdd)、時 (hh24miss) を単一の値として指定します。たとえば、201911210000 となります。
%$[yyyymmdd];
と $[hh24miss] 変数を設定します。- 夏時間が開始する際、23 個のインスタンスがその日に生成されます。 03:00 の 10 分前は、01:50 です。
- 夏時間が終了する際、24 個のインスタンスがその日に生成されます。 03:00 の 10 分前は、02:50 です。
日、週または月単位でスケジューリングされたノードが、夏時間が開始する日にスキップされる時間内に実行されるように設定されている場合、ノードインスタンスが生成され、その日の 00:00 に実行されます。
時間パラメーターの $[] と ${} との違い
- $bizdate:データタイムスタンプ。 デフォルトでは、このパラメーターはノードが実行される予定日時の 1 日前です。
- $cyctime:ノードのスケジューリングされた実行時刻。 日単位でスケジューリングされたノードに時刻がスケジューリングされていない場合、$cyctime はその日の 00:00
に設定されます。 時間の精度は、秒単位です。 このパラメーターは通常、時間単位または分単位でスケジューリングされたノードに使用します。
たとえば、スケジューリングされた時刻が当日の 00:30 の場合、
yyyy-mm-dd 00:30:00
となります。 - ${} を使って時間パラメーターを設定した場合、$bizdate はノード実行の基準として使用されます。 遡及的なデータ生成中、この時間パラメーターは選択したデータタイムスタンプに置き換えられます。
- $[] を使って時間パラメーターを設定した場合、$cyctime はノード実行の基準として使用されます。 Oracle の時間と同じ方法で計算されます。 遡及的なデータ生成中、この時間パラメーターは選択したデータタイムスタンプ
+ 1 日に置き換えられます。
たとえば、データタイムスタンプが遡及的なデータ生成中に20190720 に設定されている場合、cyctime は、20190721 に置き換えられます。
$cyctime=20190720103000
とします。
$[yyyy]=2019, $[yy]=19, $[mm]=07, $[dd]=20, $[yyyy-mm-dd]=2019-07-20, $[hh24:mi:ss]=10:30:00, $[yyyy-mm-dd] $[hh24:mi:ss]=2019-07-20 10:30:00
$[hh24:mi:ss-1/24]=09:30:00
$[yyyy-mm-dd] $[hh24:mi:ss -1/24/60]=2019-07-20 10:29:00
$[yyyy-mm-dd] $[hh24:mi:ss -1/24] = 2019-07-20 09:30:00
$[add_months(yyyymmdd,-1)]=2019-06-20
$[add_months(yyyymmdd,-12*1)]=2019-07-20
$[hh24]=10
$[mi]=30
- ODPS SQL ノードのコードに pt=${datetime} が含まれ、ノードに設定されたパラメーターが datetime=${yyyy-mm-dd} だとします。 ノードが 2019 年 7 月 20 日に実行される場合、${yyyy-mm-dd} は pt=2019-07-20 に置き換えられます。
- ODPS SQL ノードに pt=${datetime} が含まれ、ノードに設定されたパラメーターが datetime=${yyyymmdd-2} だとします。 ノードが 2019 年 7 月 20 日に実行される場合、${yyyymmdd-2} はpt=20190718 に置き換えられます。
- ODPS SQL ノードに pt=${datetime} が含まれ、ノードに設定されたパラメーターが datetime=${yyyymm-2} だとします。 ノードが 2019 年 7 月 20 日に実行される場合、${yyyymm-2} は pt=201905 に置き換えられます。
- ODPS SQL ノードに pt=${datetime} が含まれ、ノードに設定されたパラメーターが datetime=${yyyy-2} だとします。 ノードが 2019 年 7 月 20 日に実行される場合、${yyyy-2} は pt=2017 に置き換えられます。
ODPS SQL ノードを設定する際に複数のパラメーターに値を代入する場合、パラメーターを空白文字で区切ります。 たとえば、startdatetime=$bizdate enddatetime=${yyyymmdd+1} starttime=${yyyy-mm-dd} endtime=${yyyy-mm-dd+1} です。
スケジューリングパラメーターのテスト
ノード設定タブで、上部のナビゲーションバーにある [実行] または [引数付きで実行] アイコンをクリックします。 設定された値は、コード内の変数に代入されます。 [プロパティ] タブで設定したパラメーター値が希望どおりかどうかを確認することはできません。
パラメーター値は、オペレーションセンターでノードが実行されるときのみ置き換えられます。 ノード設定タブのパラメーター値をテストするためには、上部のナビゲーションバーで [開発環境でスモークテストを実行] アイコンをクリックします。 表示されるダイアログボックスで、データタイムスタンプを入力し、自動ノードスケジューリングをシミュレートします。そして指定したタイムスタンプで、スケジューリングパラメーターの置き換えられた値を取得します。
- 開発環境でノードのスモークテストを実行する際、ノードのスケジューリングパラメーターを編集する場合は、ノードを保存し、開発環境で再度ノードをコミットする必要があります。 この場合、ノードがアップデートされます。
- 開発環境でスモークテストを実行する場合、生成されたテストインスタンスに対して料金が請求されます。
オペレーションセンターでの置き換えられたパラメーターの確認
[DataStudio] ページで、左上にある DataWorks アイコンをクリックします。 の順に選択します。
左側のナビゲーションウィンドウで、
の順に選択し、本番環境のノードの依存関係やスケジューリング設定を確認します。本番環境へノードをデプロイするたびに、ノードが期待どおりに設定されているかどうかを確認することができます。 たとえば、スケジューリングパラメーターの値を確認することができます。
自動トリガーノードでは、毎日各ノードに対するインスタンスのスケジューリングパラメーターの置き換えられた値が期待どおりかどうかを確認することができます。 自動トリガーノード用に生成されたインスタンスのスケジューリングパラメーターの値は、インスタンスが生成されるときに置き換えられます。 ビジネスロジックでエラーが発生した場合は、有向非巡回グラフ (DAG) にあるターゲットノードを右クリックし、[ノードの詳細を表示] を選択します。 表示される [ノード情報] ページで、祖先ノードと子孫ノードのスケジューリングパラメーターの置き換えられた値を確認します。
[DataStudio] ページで自動トリガーノードのスケジューリングパラメーターを修正する場合、ノードをコミットし、ノードを本番環境へデプロイします。ノード情報ページにある [引数] フィールドで、ノードのパラメーター値が期待どおりになっているかどうかを確認する必要があります。
- 正常に実行された、または失敗したインスタンスを再実行しないでください。 ノードのスケジューリングパラメーターを修正した後で、ノードに対するインスタンスが再度生成されます。
- デプロイされた直後に生成されたインスタンスがスケジュールを修正すると、修正されたスケジューリングパラメーターは、本番環境で実行されていないインスタンスに対して有効になります。 ノードがデプロイされた直後にインスタンスを生成する方法については、「即時インスタンス生成」をご参照ください。
例
-
- システムパラメーターを使う場合、コード内で直接参照することができます。[プロパティ] タブにある [引数] フィールドで設定する必要はありません。
- カスタムパラメーターを使う場合、[プロパティ] タブにある [引数] フィールドで、変数名=カスタムパラメーター の形式を使って値を代入し、コード内で変数名を参照する必要があります。
-
- Shell ノードのパラメーター設定手順は、ODPS SQL ノードの設定手順と似ていますが、変数の命名規則が異なります。
- Shell ノードの変数名はカスタマイズすることはできません。$1,$2,$3... 形式に従う必要があります。 Shell ノードのパラメーター数が 10 に達した場合、${10} を使って 10 番目の変数を宣言します。
- コードに対する侵入を防ぐために、PyODPS ノードの ${param_name} 文字列はコード内では置き換えることができません。 ただし、コードを実行する前に、args という名前の辞書オブジェクトをグローバル変数へ追加し、スケジューリングパラメーターの値を取得することができます。
たとえば、ノード設定タブの [基本属性] セクションにある [引数] フィールドにdef=${yyyymmdd} を入力します。 次の図では、コード内のパラメーター値を取得する方法について示しています。
タブで、
よくある質問
- Q:テーブルパーティションの形式が、pt=yyyy-mm-dd hh24:mi:ss なのですが、スケジューリングパラメーターで空白文字が使えません。 $[yyyy-mm-dd hh24:mi:ss] の形式はどのように設定できますか。
A:カスタム変数 datetime=$[yyyy-mm-dd] および hour=$[hh24:mi:ss] を使って、それぞれ日付と時刻を取得します。 そして、コードの中で文字列を結合して pt=${datetime} ${hour} を作成します。
注 2 つの変数は、空白文字で区切ります。 - Q:コード内のテーブルパーティションは、pt=${datetime} ${hour} です。 ノードが実行された最終時刻のデータを取得するために、カスタム変数 datetime=$[yyyymmdd] および hour=$[hh24-1/24] を使って、それぞれ日付と時刻を取得できます。 しかし、00:00 に実行されるインスタンスでは前日の 23:00 ではなく当日の 23:00 のデータを解析してしまいます。
この場合、どのような処置を取れば良いでしょうか。
datetime の形式を $[yyyymmdd-1/24] へ変更し、時刻の形式を $[hh24-1/24] のままにします。 ノードは次のとおり実行されます。
- 2015-10-27 00:00:00 に実行される予定のインスタンスでは、$[yyyymmdd-1/24] および $[hh24-1/24] の値は、それぞれ 20151026 および 23 となります。 これは、スケジュールされた時間から 1 時間引いたものが前日の時刻値になるからです。
- 2015-10-27 01:00:00 に実行される予定のインスタンスでは、$[yyyymmdd-1/24] および $[hh24-1/24] の値は、それぞれ 20151027 および 00 となります。 これは、スケジュールされた時間から 1 時間引いたものが現在の日の時刻値になるからです。
- [DataStudio] ページでは次の方法を使ってノードを実行することができます。
- [実行]:[実行] アイコンを初めてクリックした後は、手動でコード内の変数へ値を代入する必要があります。 DataWorks はこれらの値を記録します。 コードを編集しても、変数はノードを初めて実行したときに代入された値を使用します。
- [引数付きで実行]:コード内の変数へ手動で値を代入する必要があります。
- [開発環境でスモークテストを実行]:データタイムスタンプを入力して、自動ノードスケジューリングをシミュレートします。そして、指定したデータタイムスタンプでスケジューリングパラメーターの置き換えられた値を取得します。
- 開発環境でのノードを実行:スケジューリングシステムは、現在のインスタンスでスケジューリングされている実行時刻に基づいて、スケジューリングパラメーター (システムパラメーターおよびカスタムパラメーターを含む) の値を自動的に置き換えます。
- ノードのテスト、または遡及的データの生成:データタイムスタンプを指定する必要があります。 各インスタンスのスケジューリングされた時刻は、前述した式に従って計算することができます。