【Talend】sequenceで連番を振る方法。グループごとの採番もok

はじめに

今回は、Talend内で連番を振る方法についての記事です。

番号をジョブ内で発番する、というのは割とよくあるシチュエーションかと思います。
もちろん、Javaでグローバルなカウンタでも用意して自身で連番を取っても良いんですが、Talendにはそれ用の便利な関数がありますので、今回はそれを使って連番を振ってみましょう。

また、単に連番を取得するだけではなく、グループごとに番号を振るケースもしばしばあると思いますので、そちらも併せて載せています。

連番を発番する関数(Numeric.sequence)

Talendの標準関数で連番を返してくれる便利な関数があります。
それがsequence関数です。下記のように使います。

Numeric.sequence("s1", 1, 1)

第一引数は、連番を振るグループを識別するための文字列を与えます(ここは後述します)。
第二引数は、初期値を、
第三引数は、増やす幅を与えます。

グループ関係なしに単純に採番する

まずは、1から1ずつ増える、簡単な採番を行ってみます。
今回は、下記のようなジョブを作ってみました。

talend_seq1

とあるトランザクションデータを入力とし、シーケンスを発番して付与するシンプルなジョブです。
tFileInputDelimitedのカラム定義は下記の通りです。

talend_seq2

不要とは思いますが、今回使用したサンプルデータは下記です。

ID,HIN_CD,SUURYO,TANI,TANKA,KAKAKU_TANI,KINGAKU
9876000001,000000000000000003,1,ST,290,1,290
9876000001,000000000000000013,1,ST,5600,1,5600
9876000001,000000000000000004,1,ST,750,1,750
9876000001,000000000000000003,1,ST,290,1,290
9876000002,000000000000000003,5,ST,398,1,1990
9876000002,000000000000000100,20,KG,0,1,0
9876000003,000000000000000003,1,KAN,398,1,398
9876000004,000000000000000016,1,ST,480,1,480
9876000004,000000000000000015,3,ST,360,1,1080
9876000004,000000000000000016,1,ST,480,1,480
9876000005,000000000000000011,1,ST,600,1,600
9876000005,000000000000000003,1,ST,290,1,290
9876000006,000000000000000100,30,KG,200,1,6000
9876000006,000000000000000003,5,ST,398,1,1990
9876000006,000001110010000000,1,ST,1269,1,1269
9876000006,000001120610000000,2,ST,2893,1,5786
9876000006,000001110010000000,2,ST,1200,1,2400
9876000007,000001221580000000,1,ST,3704,1,3704
9876000007,000001130030000000,2,ST,2101,1,4202
9876000007,000002222440000000,3,ST,2589,1,7767
9876000008,000002222170000000,1,ST,5491,1,5491
9876000008,000001221580000000,1,ST,3704,1,3704
9876000008,000001212580000000,1,ST,3360,1,3360
9876000008,000001221580000000,2,ST,3704,1,7408
9876000009,000001110010000000,3,ST,1200,1,3600
9876000009,000001120610000000,1,ST,2893,1,2893
9876000009,000001110010000000,3,ST,1269,1,3807
9876000009,000001212580000000,2,ST,3360,1,6720
9876000009,000001130030000000,1,ST,2101,1,2101
9876000009,000001110010000000,2,ST,1200,1,2400
9876000010,000001221580000000,1,ST,3704,1,3704
9876000010,000000000000000010,1,ST,300,1,300
9876000010,000001221580000000,1,ST,3704,1,3704
9876000010,000001130030000000,3,ST,2101,1,6303
9876000011,000001212580000000,4,ST,3360,1,13440
9876000011,000001120610000000,2,ST,2893,1,5786
9876000012,000002222170000000,1,ST,5491,1,5491
9876000012,000002222170000000,1,ST,5491,1,5491
9876000013,000002222170000000,2,ST,5491,1,10982
9876000013,000001110010000000,1,ST,1269,1,1269

件の連番を取っている箇所はtMap内にあります。

talend_seq4

VarでNumeric.sequenceを使用し、1から1ずつ増える番号を取得しています。
ここで、sequence関数の第一引数に、固定で”s1″を与えているので、シーケンスを振るグループがずっと変わらないため、1から始まる連番が途切れることなく発番されます。
式ビルダを開くと、左下のCategoriesでNumericを選択すると、Functionsでsequenceが現れますので、ダブルクリックで自動挿入されます。

talend_seq5

この状態でジョブ実行すると、下記の通り1から1ずつ増える連番を得ることができます。

talend_seq6

 

とあるグループ内で連番を振る

CSVデータを、ヘッダ-明細という構造に変換する場合で、同一ヘッダ内で連番を振りたいケースなどですね。
今回は、先ほどのサンプルデータにあるIDが同じレコード内で連番を振る様にしてみます。

先ほどと同じくNumeric.sequenceを使用しますが、第一引数を変更します。
第一引数が、シーケンス番号を振るグループで同一の値となるようにセットしてあげれば良いです。

先ほどのtMapのVar->meisai_noを修正します。

talend_seq7

先ほどは、第一引数に”s1″を与えていました。
固定値ですので、ずっとシーケンスグループが変わらず1から連番が振られていました。

今回は、第一引数に”SEQ_” + row1.ID を与えています。
IDが同一である場合は0から始まり1ずつカウントアップされた値が発番されますが、IDが異なる場合は、また別に0から1ずつカウントアップされるようになります。

sequenceの内部でハッシュを持っているようで、第一引数はそこのキーを示している感じですね。

この状態で実行すると、下記のような結果を得られます。

talend_seq8

同一のID(一番左の項目)が続く部分では、その右隣の明細番号の項目が増えていますが、IDが変われば明細番号がまた0から発番されています。

 

今回は、プレフィックスとして”SEQ_”を与えていますが、「今回の場合は」不要です。
とりあえずrow1.IDだけ与えれば想定通りの挙動を得られます。
が、もしrow1.IDだけを与えた場合、このIDと同一のシーケンスが既に別で振られていた場合、そちらと干渉してしまいます。

ので、シーケンスを複数使用する場合などでは、それぞれで異なるシーケンスグループを使用するように、”SEQ_”などの固有プレフィックスを付与するのが望ましいと思います。

まとめ

  • 連番はNumeric.sequenceを使用することで発番できる
  • 単純に増え続ける値が欲しいのであれば、Numeric.sequence(“s1”, 1, 1)でok(sequence関数を選択時のデフォルト値)
  • グループごとに異なる連番が欲しいのであれば、Numeric.sequence(同一グループと見なす条件の文字列, 初期値, 増加値)

 

今回は以上です!

コメントを残す

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