今回は、Talend内で行(row)データをx倍にする方法についてまとめました。
はじめに
意外とTalendで行数を増やす方法は無い
行(row)データを増やす方法は、意外とTalendには無いようです。(個人調べ)
減らす方法はいくつかありますが(tMapのフィルタ機能, tAggregateRowで集計するなど)…
行数をx倍したいケースって…?
あまり無いですかね…
ただ、例えば、
・会計まわりのプログラムを組む時で、1レコードごとに会計伝票の貸借を作りたい!
とか、
・1行を項目(列)単位に処理したい!
場合などは、稀にあるかなと思います。
実際、私も実務で2度、レコードをx倍しないとならないケースに遭遇しました。
行数をx倍する方法
rowデータをx倍するための2つのパターンを盛り込んだサンプルジョブを作ってみました。下記のような感じです。
テキトーな行を作り出すためにtRowGeneratorを使用し、tHashOutputで一旦キャッシュしておきます。(後に2処理で使用するので)
一番初めのtRowGeneratorの設定は下記の通り。
3カラム定義し、それを3行作り出すような設定です。
メインの行数をx倍する側のサブジョブですが、
「方法1」では、tHashInput⇒tFlowToIterate⇒tRowGeneratorと繋げています。
「方法2」では、tHashInput⇒tJavaFlexと繋げています。
このジョブを実行すると、結果は下記の通りにx倍されることが分かります。
(今回は3倍です)
もともとのレコードは3件ですが、方法1, 方法2ではそれぞれ9件のレコードが出力されています。
下記の項目から、具体的にどういうコンポーネント構成になっているかを見ています。
方法1.tFlowToIterateでrowをiterateする
そもそも、tFlowToIterateって何だよ!」という感じですが…今度詳しくまとめます。
tFlowToIterateは、自リンクに刺さる入力側のRowをIterateに変換します。
つまり、1rowごとに新たにサブジョブを適用することができます。
こちらの方法では、1rowごとに新たにtRowGeneratorで3行生成するようにtRowGeneratorを設定しています。
3カラム定義で3行生成するように設定。
tLogRowでログ出力した時に分かり易いよう、header_textカラムには”【方法1】”の固定文字をセットしています。
次に、とても重要な部分が切れてしまって悲しいのですが…
idカラムとrandom_stringカラムに、tFlowToIterateに流れてきたrowデータをセットする必要がありますので、id, random_stringカラムには下記のコードをセットしています。
id
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の使い方まとめ)
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倍する方法をご紹介しました。
他にもっとクールな方法があった是非教えて頂きたいです。
今回は以上です!