【Talend】行(row)データをx倍に増やす2つの方法

今回は、Talend内で行(row)データをx倍にする方法についてまとめました。

はじめに

意外とTalendで行数を増やす方法は無い

行(row)データを増やす方法は、意外とTalendには無いようです。(個人調べ)
減らす方法はいくつかありますが(tMapのフィルタ機能, tAggregateRowで集計するなど)…

行数をx倍したいケースって…?

あまり無いですかね…
ただ、例えば、
・会計まわりのプログラムを組む時で、1レコードごとに会計伝票の貸借を作りたい!
とか、
・1行を項目(列)単位に処理したい!
場合などは、稀にあるかなと思います。

実際、私も実務で2度、レコードをx倍しないとならないケースに遭遇しました。

行数をx倍する方法

rowデータをx倍するための2つのパターンを盛り込んだサンプルジョブを作ってみました。下記のような感じです。

talend_xtimes1

テキトーな行を作り出すためにtRowGeneratorを使用し、tHashOutputで一旦キャッシュしておきます。(後に2処理で使用するので)

一番初めのtRowGeneratorの設定は下記の通り。

talend_xtimes2

3カラム定義し、それを3行作り出すような設定です。

メインの行数をx倍する側のサブジョブですが、
「方法1」では、tHashInput⇒tFlowToIterate⇒tRowGeneratorと繋げています。
「方法2」では、tHashInput⇒tJavaFlexと繋げています。

このジョブを実行すると、結果は下記の通りにx倍されることが分かります。
(今回は3倍です)

talend_xtimes4

もともとのレコードは3件ですが、方法1, 方法2ではそれぞれ9件のレコードが出力されています。

下記の項目から、具体的にどういうコンポーネント構成になっているかを見ています。

方法1.tFlowToIterateでrowをiterateする

そもそも、tFlowToIterateって何だよ!」という感じですが…今度詳しくまとめます。

tFlowToIterateは、自リンクに刺さる入力側のRowをIterateに変換します。
つまり、1rowごとに新たにサブジョブを適用することができます。

こちらの方法では、1rowごとに新たにtRowGeneratorで3行生成するようにtRowGeneratorを設定しています。

talend_xtimes3

3カラム定義で3行生成するように設定。
tLogRowでログ出力した時に分かり易いよう、header_textカラムには”【方法1】”の固定文字をセットしています。

次に、とても重要な部分が切れてしまって悲しいのですが…
idカラムとrandom_stringカラムに、tFlowToIterateに流れてきたrowデータをセットする必要がありますので、id, random_stringカラムには下記のコードをセットしています。

id

(Integer)globalMap.get("row2.id") 

random_string

(String)globalMap.get("row2.random_string") 

ここはtFlowToIterateの説明になってしまいますが…
デフォルトの設定をしておくと、tFlowToIterateに接続したin側のrowを、上記の通りIterateのサブジョブの中で参照することができます。

以上より、tHashInputから3行Iterate, Iterate内では3行RowGenerateするので、3×3で9rowを作り出すことができました。

方法2.tJavaFlexでrowごとにforループする

こちらは、tJavaFlexでJavaコードとしてfor文を書いてループさせる方法です。
(tJavaFlexの使い方についてはこちら⇒【Talend Open Studio】tJava,tJavaRow,tJavaFlexの使い方まとめ)

talend_xtimes5

start codeにfor文の先頭を記述します。
今回は1rowを3倍にしたいので、forのbreak条件はi < 3にしておきます。

main codeにカラムへのセット内容編集を記述します。

end codeは今回は特に無いので、for文のクローズ記号だけを書いておきます。

これで、1rowにつき3ループ実行されるので、3×3で9row生成されます。

その他の思いつく方法

tMapのjoinの性質を利用する

2つのソースを持つtMapで、互いのキーを設定しない場合も、入力1側 * 入力2側のレコード数の行を生み出すことができますが、あまり好みではなかったので今回取り上げるのはやめました。

tMapでoutputを分割、tUniteで結合

他にも、tMapで2つのoutputを吐いておいて、それらを後にtUniteで合体させて2倍にしたり、という方法もありますが、x倍にするためにはtMapにその分のoutputが必要なので無駄にジョブが肥大化するので、同じく取り上げるのはやめました。

おわりに

今回は、できるだけシンプルに行データをx倍する方法をご紹介しました。
他にもっとクールな方法があった是非教えて頂きたいです。

今回は以上です!

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です