スケジュールされたタスクでは、スケジューリングパラメーターによって返される標準の時間フォーマットが、月末、四半期、またはカスタム時間オフセットの取得など、複雑なビジネス要件を満たさない場合があります。このような場合、エンジン関数を使用して戻り値を後処理し、必要な時間フォーマットを生成できます。その方法には、計算ノード内での直接変換や、代入ノードを使用した事前処理などがあります。
ビジネスシナリオ
データ開発および抽出・変換・書き出し (ETL) フローでは、タスクスケジューリングは特定の時間ディメンションに依存することがよくあります。例として、会計サイクル (前月の最終日) に基づく月次決済や、時間または分レベルのタイムウィンドウを使用した増分データ同期などが挙げられます。スケジューリングパラメーターはデフォルトで標準の時間フォーマットを返すため、これらの複雑で非標準の時間文字列を直接生成することはできません。したがって、その戻り値を後処理する必要があります。
ソリューション
スケジューリングパラメーターを後処理するには、主に 2 つの方法があります。1 つは、ODPS SQL ノードなど、関数計算をサポートするノード内で直接処理する方法です。もう 1 つは、代入ノードで事前処理してから、その結果を下流ノードに渡す方法です。どちらの方法を選択するかは、ターゲットノードがそのコード内で直接的な関数変換をサポートしているかどうかによって決まります。
直接処理:ODPS SQL ノードなど、関数計算をサポートするノードでは、コード内でエンジン関数を直接使用して、スケジューリングパラメーターの戻り値を変換できます。
間接処理:ターゲットノード (一部のオフライン同期ノードなど) がコード内での関数変換をサポートしていない場合は、上流に代入ノードを追加できます。この代入ノードが関数変換を実行し、その出力をコンテキストパラメーターとして子孫ノードに渡します。
実装手順
以下のすべてのシナリオにおいて、タスクインスタンスのスケジュール時刻 (CYCTIME) は 20250727000500 であると仮定します。
シナリオ 1:SQL ノードでの戻り値の直接処理
ODPS SQL ノードを例にとると、このノードは MaxCompute SQL 関数を使用して、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'
event_time >= '${beginDateTime}0000' AND event_time < '${endDateTime}0000'例:戻り値の開始時刻は
20250726230000、終了時刻は20250727000000です。
シナリオ 3:代入ノードを使用した下流ノードのためのパラメーターの事前処理
一部のバッチ同期ノードなどのターゲットノードが、関数を使用してスケジューリングパラメーターを直接処理できない場合は、代入ノードを使用して事前処理を行うことができます。例えば、バッチ同期タスクが増分同期のためにタイムスタンプフィールドを使用する必要がある場合は、次の手順に従います。
代入ノードを作成できます。
代入ノードで、
unix_timestampなどのエンジン関数を使用して、標準のスケジューリングパラメーター (例:$[yyyymmddhh24miss]) を UNIX タイムスタンプフォーマットに変換します。代入ノードからの出力 (変換されたタイムスタンプ) を、下流のオフライン同期ノードの入力パラメーターとして使用します。詳細については、「ノードコンテキストパラメーターの設定と使用」をご参照ください。