Datastage（on CP4D）実行前祝日判定サブルーチン

# この記事について
- この記事は[IBMが提供する製品に関する情報やナレッジを共有する Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ibm_data_ai_automation)の12月10日分として記載しています。

# Datastage について

- Datastage は、いわゆるETLソフトウェアであり、データソースからデータをExtract、Transform、Load、する事を目的としたものです

![スクリーンショット 2024-12-09 17.54.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/2c440bb7-ae46-26b6-3312-f809266f2d41.png)
---

- Transformする箇所をどこに設定するかによって、ETLだったり、ELTだったり、TELだったりに変更できますが、今回はETL（下図のうち一番上のもの）として扱います
![スクリーンショット 2024-12-09 17.32.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/0fedf2d6-41a7-94f5-2148-158cc4f33bc2.png)

---

- なお、ELT/TELの場合、内部では[dbt](https://www.getdbt.com/product/what-is-dbt)を使用しています
    - 参考サイト：https://www.ibm.com/docs/ja/cloud-paks/cp-data/5.0.x?topic=mode-elt-materialization-policies-in-datastage

![スクリーンショット 2024-12-14 14.08.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/3fdf6796-05e9-45fd-63ea-260806750302.png)

---


- 稼働環境としては、Software版とSaaS版があります
    - Software版：Cloud Pak for Data （CP4D）上のソフトウェア・カートリッジとして稼働
        - （従来のIISとしてのDatastageについてはここでは記載しません）
    - SaaS版：IBM Cloud上のサービスとして稼働
---
- サブルーチンの設定はSoftware版でもSaaS版でもできますが、今回はSoftware版（CP4D5.0.3）を使用しています
- なお、SaaS版Datastageの使い方については、[こちらの記事](https://qiita.com/Shumpei_Kubo/items/aad5aa18731224d3dfcb)で記載しています

# 実行前祝日判定サブルーチン について
- DatastageはETL、つまり主にバッチジョブとして大量データを処理するソフトウェアとして稼働するものであり、決まった時間にタイマー起動する事が多い製品です
- 外部のスケジューラ（IWSやJP1等）からの呼び出しで起動することが多いのですが、Datastage自体にもスケジューラ機能は備わっています


- Datastageのスケジューラを確認すると、実行の開始日/時間、終了日/時間、実行頻度、実行しない曜日、の設定はあるのですが、スケジューラでは祝日の設定をすることができません

![スクリーンショット 2024-12-09 18.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/5155c763-61a3-ea8b-9881-fcc315a9398c.png)



- そこで、Datastageの実行前サブルーチンに祝日判定を組み込み、祝日であればその旨のメッセージを出力して終わる（異常終了）ように設定してみました

# 設定方法

## 祝日の取得方法

- [内閣府のデータ](https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv)から取得します
- コマンドとしては、以下のスクリプトを使用して、awkコマンドで1列目だけを取得し、2024年分のみgrepしています（しなくてもいいですが）
- 2列目以降を取得しないのは、2列目以降は文字化けしていて取り込むと文字ではなくバイナリ扱いされてうまく処理できない為です
```
export SHUKUJITU=`curl -sL https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv |awk -F',' '{print $1}'| grep 2024`
```

## GUIでの設定方法
- 設定箇所はこちら、Datastageフロー画面上部の「設定」をクリックします
![スクリーンショット 2024-12-10 13.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/2c5224d3-e001-1184-a8d8-467cc3fe1929.png)

- 「ジョブ前処理/後処理サブルーチン」をクリック
![スクリーンショット 2024-12-10 13.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/188af169-80fc-fc55-8a4d-d93a6f5f4a2d.png)

- 「サブルーチンの選択」から「シェル・コマンドの実行」を選択
![スクリーンショット 2024-12-10 13.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/af61d5bb-234d-233b-9b80-0feadd6c48b5.png)

- 「ジョブ・ログにシェル・コマンド行を書き込む」をクリックして、テキストボックスに内容を入力し、「保存」をクリック
![スクリーンショット 2024-12-10 13.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/d99ac895-f49f-31f5-fc77-da0a8eb29688.png)


- 上記を踏まえて、サブルーチンに設定するテスト用の内容は以下です
- 内閣府から取得した祝日日付と本日日付を比較し、本日日付が祝日に該当した場合には処理を止める、という流れ担っています
- 以下内容では、テストの為に本日日付をべた書きで祝日に設定しています
```
#祝日リスト取り込み（最初にawkコマンドで1列目だけを取得する。2列目以降は文字化けしていて、取り込むと文字ではなくバイナリ扱いされてうまく処理できないので）
export SHUKUJITU=`curl -sL https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv |awk -F',' '{print $1}'| grep 2024`

#本日日付を取り込む。以下はわざと祝日日付を設定している
#export TODAY=`date '+%Y/%m/%d'`
export TODAY="2024/11/3"

#祝日判定フラグ。デフォルトでは平日としておく
export FLAG=weekday

# 以下、for文で祝日リストと本日日付の突き合わせを実施。本日が祝日リストの中に含まれる場合はフラグを祝日として変更。
# 日付は数字扱いではないので、-eq で判定せず、= を使う。
for list in $SHUKUJITU
do
    if [ $list = $TODAY ];
    then
        FLAG=holiday
    fi
done

echo "FLAG is"
echo $FLAG


#フラグが祝日の場合、異常終了する。（異常終了以外の終わり方がなさそう。。。）
if [ $FLAG = holiday ];
then
    echo HOLIDAY_STOP
    exit 1
else
    echo WEEKDAY_ROUTINE
    exit 0
fi
```


上記設定で実行した場合のログは以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/a8110e55-c4ac-2e43-ac14-41bbd138c65b.png)

設定した、「HOLIDAY_STOP」の文言が確認できました


実行ログを抜き取ったものが以下です

```
1 2024-10-30 03:47:36 WARNING IIS-DSEE-TCOS-00051 <main_program> Failed to parse message handler entry, the message ID is not in an expected format like TFSR0114, or TFSR-00114, or IIS-DSEE-TFSR-00114. MessageId: HOLIDAY Action: demote2 2024-10-30 03:47:36 WARNING IIS-DSEE-TOSH-00395 BeforeJob (ExecSH): コマンドの実行中にエラーが発生しました: export SHUKUJITU=`curl -sL https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv |awk -F',' '{print $1}'| grep 2024`
 
 #export TODAY=`date '+%Y/%m/%d'`
 export TODAY="2024/11/3"
 
 export FLAG=weekday
 
 for list in $SHUKUJITU
 do
     if [ $list = $TODAY ];
     then
         FLAG=holiday
     fi
 done
 
 echo "FLAG is"
 echo $FLAG
 
 if [ $FLAG = holiday ];
 then
     echo HOLIDAY_STOP
     exit 1
 else
     echo WEEKDAY_ROUTINE
     exit 0
 fi3 2024-10-30 03:47:36 INFO IIS-DSEE-TOSH-00401 *** コマンドからの出力: ***
4 2024-10-30 03:47:36 INFO IIS-DSEE-TOSH-00402 FLAG is
 holiday
 HOLIDAY_STOP
 5 2024-10-30 03:47:36 ERROR IIS-DSEE-TOSH-00409 ジョブが停止しました - ジョブ前処理ルーチンがエラーを返しました。エラー 1 が BEFORE ルーチンから返されました
```



# さいごに
- このような形で祝日判定を処理前に組み込むことで、Datastage単体でも祝日に対応できます