タスクをスケジュールする際、スケジューリングパラメーターによって返される標準の時間フォーマットは、月末、四半期末、またはカスタムの時間オフセットの取得など、複雑なビジネスシナリオの要件を満たさない場合があります。このような場合、エンジン関数を使用して戻り値を後処理し、必要な時間フォーマットを生成できます。計算ノードで値を直接変換するか、代入ノードを使用して前処理することができます。
ビジネスシナリオ
データ開発および ETL (抽出·変換·書き出し) フローでは、タスクのスケジューリングは特定の時間ディメンションに依存することがよくあります。例としては、前月の最終日などの会計サイクルに基づく月次決済や、時間または分レベルのタイムウィンドウを使用する増分データ同期などがあります。スケジューリングパラメーターはデフォルトで標準の時間フォーマットを返すため、これらの複雑で非標準の時間文字列を直接生成することはできません。戻り値を後処理する必要があります。
解決策
スケジューリングパラメーターを後処理するには、主に 2 つの方法があります。ODPS SQL ノードなど、関数計算をサポートするノード内で直接処理できます。または、代入ノードを使用して前処理し、その結果を下流ノードに渡すこともできます。どちらのメソッドを選択するかは、ターゲットノードがそのコードで直接関数実行をサポートしているかどうかによって決まります。
直接処理: ODPS SQL ノードなど、関数計算をサポートするノードでは、コード内でエンジン関数を直接使用して、スケジューリングパラメーターの戻り値を変換できます。
間接処理: バッチ同期ノードなどのターゲットノードがコード内での関数実行をサポートしていない場合は、上流に代入ノードを追加できます。この代入ノードは関数変換を実行し、その出力をコンテキストパラメーターとして下流ノードに渡します。
実装
以下のシナリオでは、タスクインスタンスのスケジュールされた時間 (CYCTIME) が 20250727000500 であると仮定します。
シナリオ 1: SQL ノードで戻り値を直接処理する
このシナリオでは、ODPS SQL ノードを例として使用します。ODPS SQL ノードは、SQL 文で MaxCompute SQL 関数を直接使用してスケジューリングパラメーターを処理することをサポートしています。他のタイプの SQL ノードについては、特定のエンジンでサポートされている関数の種類をご参照ください。
前月の最終日を取得する
前月の最終日を yyyymmdd 形式で取得します。これは、月次データのパーティション分割や決済によく使用されます。
パラメーター構成: 現在のタスクのスケジュールされた時間の年と月を取得するようにスケジューリングパラメーターを構成します。
last_month=$[yyyy-mm]処理ロジック: ODPS SQL コードでは、まず当月の最初の日を構築します。次に、
DATEADD関数を使用して 1 日を減算し、前月の最終日を取得します。最後に、REPLACE関数を使用して区切り文字を削除します。SELECT REPLACE(DATEADD(date'${last_month}-01',-1,'dd'),'-','');例:
last_monthパラメーターの値は2025-07です。関数が値を処理した後、返される結果は20250630です。
現在の四半期を取得する
タスクのスケジュールされた時間が属する四半期 (1, 2, 3, または 4) を、月に基づいて計算します。
パラメーター構成: 月を取得するようにスケジューリングパラメーターを構成します。
month=$[mm]処理ロジック: ODPS SQL コードでは、月を 3 で除算し、最も近い整数に切り上げて四半期を計算できます。
SELECT CEIL(CAST('${month}' AS INT)/3);例:
monthパラメーターの値は07です。関数が値を処理した後、返される結果は3です。
スケジュールされた時刻の 15 分前の時間コンポーネントを取得する
正確な時点でデータスライスが必要なシナリオでは、スケジュールされた時間に対する任意の時間オフセットを取得できます。
パラメーター構成: スケジューリングパラメーターで算術演算
-15/24/60を使用して、15 分前の年、月、日、時、分を直接取得します。year=$[yyyy-15/24/60]month=$[yyyymm-15/24/60]day=$[yyyymmdd-15/24/60]hour=$[hh24-15/24/60]mi=$[mi-15/24/60]処理ロジック: これらの事前計算されたパラメーターを SQL 文で直接参照できます。
select 'year=${year} month=${month} day=${day} hour=${hour} mi=${mi}';例: 日をまたぐ計算の後、返される結果は
year=2025 month=202507 day=20250726 hour=23 mi=50です。
シナリオ 2: 増分同期の時間間隔を生成する
指定された時間間隔を必要とするバッチ同期タスクの時間パラメーターを生成できます。これらのシナリオでは、時間フォーマットが yyyymmddhh24miss であり、左閉右開区間を使用すると仮定します。
1 日のスケジュール間隔
昨日の 00:00:00 から今日の 00:00:00 までの時間間隔を取得します。
パラメーター構成: 昨日と今日の日付を取得します。
beginDateTime=$[yyyymmdd-1]endDateTime=$[yyyymmdd]処理ロジック: データフィルタリングの `WHERE` 句で、文字列を連結して時、分、秒の部分を完成させることができます。
event_time >= '${beginDateTime}000000' AND event_time < '${endDateTime}000000'例: 返される結果の開始時刻は
20250726000000で、終了時刻は20250727000000です。
1 時間のスケジュール間隔
前の時間の 00:00 から現在の時間の 00:00 までの時間間隔を取得します。
パラメーター構成: 算術演算を使用して、前の時間と現在の時間を取得します。
beginDateTime=$[yyyymmddhh24-1/24]endDateTime=$[yyyymmddhh24]処理ロジック: データフィルタリングの `WHERE` 句で、文字列を連結して分と秒の部分を完成させることができます。
event_time >= '${beginDateTime}0000' AND event_time < '${endDateTime}0000'例: 返される結果の開始時刻は
20250726230000で、終了時刻は20250727000000です。
シナリオ 3: 代入ノードを使用して下流ノードのパラメーターを前処理する
バッチ同期ノードなどのターゲットノードが、関数を使用してスケジューリングパラメーターを直接処理できない場合は、代入ノードを使用して前処理できます。たとえば、バッチ同期タスクが増分同期にタイムスタンプフィールドを使用する必要がある場合は、次のステップに従うことができます。
代入ノードを作成します。
代入ノードで、
unix_timestampなどのエンジン関数を使用して、$[yyyymmddhh24miss]などの標準スケジューリングパラメーターをタイムスタンプフォーマットに変換します。変換されたタイムスタンプ (代入ノードの出力) を、下流のバッチ同期ノードの入力パラメーターとして使用します。詳細については、「ノードコンテキストの構成」をご参照ください。