はじめに
今回は、TalendのtHashInput/Outputコンポーネントについてです。
Talendでジョブを組んでいて、
「このrowデータは後でまた使うんだよなぁ。でも一時ファイルに吐いて保存しておくのは面倒だなぁ。」
とか、
「一気にtMapに入力リンクとして突き刺せば実装できるけど…ジョブデザインが汚くなるから一旦ある程度のまとまりとしてrow編集して取っておきたいんだよなぁ。」
とか、行データを一時保存したいニーズはそこそこあると思います。
というか、ジョブを組んでいるとやっぱり結構そういう場面に出くわします。
ということで、ジョブ可読性の向上と、rowデータの複数回使用に向くtHashInput/Outputコンポーネントについて書いていきます。
tHashInput/Outputってどんなコンポーネント?
rowリンクを接続して、流れてくるrow情報をハッシュに一時保存したり、取り出したりできるコンポーネントです。
開発画面右側にある「パレット」でtHashInputまたはtHashOutputと検索すれば出てきます。
下記のようなアイコンのコンポーネントです。
tHashOutputが、入力側リンクのデータを一時保存するためのコンポーネントで、
tHashInputが、保存しておいたrowデータを取り出すためのコンポーネントです。
ジョブで使ってみる
実際にジョブで使い方確認用のジョブを組んでみます。
tRowGeneratorで4レコード生成します。
カラム定義としては、id, valの2つのInteger型で、idはシーケンスを振り、valはTalend関数でランダムな値を振っています。実際の設定は下記の通りです。
生成したrowデータをtHashOutputにリンクします。
tHashOutputの設定
tHashOutputの設定項目は多くありません。下記の通りです。
設定確認しておくのは主に下記2項目でしょうか。
- Schema(スキーマ)
- いつも通り、どんなカラム定義かを編集します。前のコンポーネントからrow接続すれば自動的にそのカラム定義が引き継がれるので特に気にしなくてokです
- Append
- チェック付与で、既にレコードが存在する場合は追加していきます。上書きしたい場合はチェックを外します
他のLink with a HashOutpuはチェックすると、他に存在するtHashOutputコンポーネントの設定を共有できる(?)ようですが、使う機会はあまりないかと…
Data write modelは Cache in memory しか選択肢が出ないので(私の環境では)特に変更無し。
Keys managementは…使い方が分からないのでそのままにしています……..
tHashInputの設定
tHashInputの設定項目も多くないです。
- Schema(スキーマ)
- 取得するrowデータのカラム定義です。こちらは、デフォルトでは定義が空なので、取得するrowデータに応じて設定が必要です。
殆どの場合、対応するtHashOutputと同様のスキーマ定義のはずなので、tHashOutputコンポーネントのカラムを全選択してコピーアイコン⇒こちらのtHashInputコンポーネントのスキーマを開いて貼り付けアイコン押下でカラム定義するのが楽ちんです。
- 取得するrowデータのカラム定義です。こちらは、デフォルトでは定義が空なので、取得するrowデータに応じて設定が必要です。
- Link With a tHashOutput のComponent list
- どのtHashOutputとリンクするかを指定します
- Clear cache after reading
- tHashInputコンポーネントでキャッシュ情報を使用したら、データをクリアする場合にチェックを入れます。
今回の場合ですと、「取り出し(2回目)」のtHashInputコンポーネントでこのチェックを入れて、rowデータをクリアしています。
- tHashInputコンポーネントでキャッシュ情報を使用したら、データをクリアする場合にチェックを入れます。
実行結果
このジョブを実行すると、下記の通り、一番上のフロー(「save rows」のサブジョブ)でhashに格納したrowデータを、後のサブジョブで2回使用できます。
一番上のサブジョブで取得した4レコードを、後の2回のサブジョブで使いまわせていますね。これは便利!
おわりに
とても便利なtHashInput/Outputなのですが、巨大なトランデータをなんでもかんでもHashに入れてしまうと…オーバーフローしてしまう可能性があります(未検証ですが…)
扱うデータがとても大きいと予想される場合は、素直に一旦一時ファイルとして吐いておくのが無難でしょう。
今回は以上です!