LoginSignup
5
2

More than 1 year has passed since last update.

Talend入門 (12)  ~子ジョブ~

Last updated at Posted at 2021-11-09

全体の目的

Talendの超簡単なサンプルジョブを作成して,ETLジョブ開発に必要なスキルを習得することが目的です。

対象者

ETL / EAI技術者

環境

使用環境 バージョン
OS Windows10
Talend 7.3.1

サンプル一覧

以下の順番で習得していきます

# 内容
1 はじめてのTalend
2 ファイルI/O
3 データベースI/O
4 tMap
5 イテレータ
6 メタデータ
7 Context変数
8 Global Map
9 tHashInput/tHashOutput
10 エラーハンドリング
11 ロギング
12 子ジョブ(ジョブのネスト)(今回)
13-1 設定ファイル読み込みオリジナル版
13-2 設定ファイル読み込みコンポ版
14 tJava

サンプルコード(Talendプロジェクトデータ)

今回の目的

別々に作成したジョブにコンテキストの値や実行結果を渡す方法を理解する。

子ジョブと親ジョブについて

Talendでは[tRunJob]コンポーネントを用いてジョブを実行することができます。このとき[tRunJob]コンポーネントを用いてジョブを呼び出した側を親ジョブ、呼び出された側を子ジョブといいます。
また、プログラミング用語としてif( 条件A ){ ... if( 条件B ){ ... } ... } といったように、条件分岐やループの内部に、別の条件分岐やループなどが含まれている状態をネストまたは入れ子と呼びます。今回作成するジョブからジョブを呼び出す形もネストといえるでしょう。
参照:IT用語辞典 e-words

サンプルプログラム概要

  1. 子ジョブと親ジョブの二つのジョブを作成
  2. 親ジョブから子ジョブに値を渡す
  3. 親ジョブか渡された値を用いて子ジョブを実行する
  4. 子ジョブの実行結果を親ジョブに渡す
  5. 子ジョブから渡された値を用いて親ジョブの処理を実行する

子ジョブの作成

リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]にchildと入力し[Finish]ボタンをクリックします。
image.png
[Contexts(context)]タブを開き[+]ボタンを1回クリックします。
そして、以下ようにContext変数を定義します。

Name Type value
num_chiled int integer 0

image.png
[tJava]を配置します。
[tJava]のコードを以下のように記載します。

System.out.println("子ジョブでの初期値 : "+context.num_child);
context.num_child+=10;
System.out.println("子ジョブでの値を加算後 : "+context.num_child);

image.png
実行してみましょう。
image.png
初期値に10が加算されていることが分かります。

親ジョブの作成

リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]にparentと入力し[Finish]ボタンをクリックします。
image.png
リポジトリの[chiled]をドラッグ&ドロップします。
d.png
[chiled]の[コンポーネント]タグを開いて[コンテキストパラメーター]の[+]ボタンを1回クリックします。
値は以下のように設定します。

パラメータ
num_chiled 2

image.png
実行してみましょう。
image.png
子ジョブのnum_chiledにが渡されて子ジョブが実行されていることが分かります。
このままだと子ジョブの実行結果を親ジョブで使用できません。以降で子ジョブから親ジョブに値を渡す方法を説明します。

子ジョブの実行結果を親ジョブに渡す

子ジョブ

ジョブ[child]を開いて[tFixedFlowInput]、[tBufferOutput]を配置します。
image.png
[tJava_1]と[tFixedFlowInput_1]をOnSubjobOk、[tFixedFlowInput_1]と[tBufferOutput_1]をロウでつなぎます。
image.png
[tFixedFlowInput_1]のスキーマ編集画面で+を1回クリックし1カラム定義します。
image.png
[値]にoutChildが追加されるのでoutChildの値をcontext.num_childにします。
image.png
[tBufferOutput_1]の同期カラムをクリックします。

親ジョブ

ジョブ[parent]を開いて[tJavaRow]を配置します。
image.png
コンポーネント[child]と[tJavaRow_1]をロウでつなぎます。
image.png
コンポーネント[child]の[子ジョブのスキーマのコピー]をクリックします。
d2.png
スキーマの編集画面を開くとoutChildが追加されています。
image.png
[tJavaRow_1]の[同期カラム]をクリックして、以下の文を[コード]に記述します。

System.out.println("子ジョブから親ジョブに値を渡したときの結果:"+row1.outChild);
row1.outChild += 100;
System.out.println("子ジョブから親ジョブに値を渡したあと100を加算した結果:"+row1.outChild);

image.png
image.png
実行してみましょう。
image.png
以下の4点が動作していることが確認できると思います。

  1. 親ジョブから子ジョブに値を渡す
  2. 親ジョブから渡された値を用いて子ジョブを実行する
  3. 子ジョブの実行結果を親ジョブに渡す
  4. 子ジョブから渡された値を用いて親ジョブの処理を実行する

まとめ

今回は子ジョブについて学んできました。
子ジョブを使うことで別々に作成したジョブに値を渡したり、受け取ることができました。
あらたに利用したコンポーネントと用途をおさらいしておきます。

  • tRunJob
    • コンポーネント[child]のことである。別のジョブを使いたいときに使用する。このとき、[tRunJob]を用いてジョブを呼び出すほうを親ジョブ、呼び出されるジョブを子ジョブという。
  • tBufferOutput
    • 子ジョブから親ジョブに値を返却するときに使用できる。

毎度のことですが、ほんのさわりの部分だけを解説していますのでぜひここから深掘りしてみてください。

次回以降

次回は設定ファイル読み込みについてやっていきます。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2