データサイエンス

Matillionでジョブ実行当日/前日の日付を変数として指定する方法

どうも、最近「自分、まだいけます!やらせてください!」と健気に奮闘する液晶バキバキの愛機(iPhone7)から、新たな愛機(iPhone SE)に乗り換え、「見ろ、世界はこんなにも鮮明だ」と画面越しにこの世の美しさを再認識するとともに、2度と旧愛機のような惨劇は繰り返すまいと、新愛機はケースに入れ液晶保護シートを貼り、完璧に防護して一安心したのも束の間、今度はポケットWifiを地面に叩きつけ、液晶をバキバキにしてしまった、分析官の岡部です。
(追記)ちなみに腹筋はとっくにバキバキです(先輩社員からご指導を承っての追記でございます。私自身の自惚れたアピールではないことにご留意くださいませ。ただし、あえてここで客観的事実を具申させていだたきますと、バキバキでございます。)

タイトルの通り、本記事はMatillionのちょっとしたTipsです。

「Matillionってなんなん?美味しいん?」という方はこちらの記事をご覧ください。

クラウドネイティブなELTツール、Matillionとはなんなのか?本ブログ記事でも度々紹介しております「Matillion」。 そもそもそれはなんなのか?なにがそんなにいいのか? その謎を探るべくA...

ではいきましょう。

 

What:何をやろうとしているのか?

その日の売上データやWebログデータを収集し、TableauなどBIツールのダッシュボードにデータを流し、日々KPIなどの指標をモニタリングしたいと思ったこと、あると思います。
データ収集に時間がかかり、前日までのデータを使用する場合なども同様です。いずれの場合も「実行当日の日付」を参照する必要があるでしょう。

その「実行当日の日付を参照する」という、いわば当たり前の設定なんですが、
Matillionでやろうとすると結構ややこしく、見事にハマってしまいました。
Matillionマスターの方に教えていただいて解決したのですが、
自分のような迷える子羊をこれ以上生み出さないためにも、記事にまとめておこうと思います。

【参考】公式ドキュメント
https://documentation.matillion.com/docs/2711553

 

How:どうやるのか?

実行当日の日付指定

Google AnalyticsのBigQueryサンプルデータを使って確認していきましょう。
{プロジェクト名}.google_analytics_sample.ga_sessions_{yyyymmdd}として格納されています。

状況としては日次でGoogle AnalyticsからWebログデータを取得し、
そのデータを元に顧客IDごとの行動属性といった分析用テーブルを作るイメージです。

まずは処理を記述するTransformation Job (date_test)を作成、
Manage Job Variablesを開き、適当な日付をyyyymmddの形式で記述します。
ここではTARGET_DATEと命名、20210101としておきました(ここはいつの日付でも構いません。)

f:id:gri-blog:20210606195420p:plain
f:id:gri-blog:20210606195507p:plain

次にSQLコンポーネントでテーブルを読み込みましょう。
(別にTable Inputコンポーネントを使ってもいいのですが、ここでは日付指定がわかりやすいように、あえてSQLコンポーネントを使っています。)
日付に対応する部分はga_sessions_${TARGET_DATE}のようにしてください。
この状態でジョブを実行すると、今のままでは(当然ですが)2021-01-01のGAデータが読み込まれてしまいます。

f:id:gri-blog:20210606195604p:plain

そこでどうするかというと、このTransaction Jobを実行するためのOrchestration Job (date_test_orchestration)を新たに作成します。
先ほど作成したdate_testをStartコンポーネントに繋ぎ、
Job Variablesにdtという名前で日付型(DateTime型)の変数を設定して下さい。
このdtは後で使います。ここでも日付は適当に指定して大丈夫です。

f:id:gri-blog:20210606202850p:plain
f:id:gri-blog:20210606195705p:plain

ここからが肝なのですが、date_testコンポーネントのSet Schalar Variableを設定していきます。
これはこのジョブ中で定義されている変数を、外から指定できるというものです。
実際、Variableの欄を押すと先程定義したTARGET_DATEが出てくるかと思います。
ちなみに何も設定されなければ、元のジョブ中で設定された値で実行されます。
pythonなどでも関数の引数にデフォルト値を設定できますが、あんな感じだと思っていただけたらいいかと。

そしてValueの欄には

${dt.now().format('yyyyMMdd')}

と打ち込んで下さい。
簡単に説明すると、dt.now()で本日の日付を取得、
.format(‘yyyyMMdd’)}でyyyymmdd形式に変換しています。

f:id:gri-blog:20210606195735p:plain

これでこのdate_test_orchestrationを実行すれば、めでたく実行当日の日付を指定できているかと思います。あとはスケジュールで起動する設定にしておけば、例えば、データ取得→データ整形→BIツールの参照データ更新、のような一連の処理が毎日寝ている間に完結しているでしょう。

 

実行前日の日付指定

データの取得と実行にタイムラグがあり、実行日から見て、昨日の日付を指定したいこともあるかと思います。

${dt.now().add("days", -1).format('yyyyMMdd')}

として下さい。dt.now().add(“days”, -1)
が昨日の日付を表します。ちなみに一昨日であれば-1を-2にするだけです。

少しややこしいかもしれませんが、落ち着いて設定すれば実行当日を参照することができているかと思います。
あとは自分が作成したい処理フローに合わせてアレンジしてみてください。
また、もっといいやり方があるよ〜という方がいれば、そっと教えていただけると助かります。

それでは良いMatillionライフを。

Taizo Okabe
脳筋系データサイエンティスト。筋肉は裏切らない。筋肉。