Talend Transformation

 


🎯 フィルター

Talendでデータをフィルター(絞り込み)する方法は?


👇 使う主なコンポーネント

コンポーネント名役割
tFilterRow特定の条件で「行(レコード)」をフィルターする
tFilterColumns「列(カラム)」を選んで残したり、並び替えたりできる
tLogRow結果をコンソールに表示する
tFixedFlowInputテスト用の固定データを作る

🧪 サンプルジョブ名:「filter」ジョブ

ステップ①:テストデータの準備

  • tFixedFlowInput で、次のようなデータを作ります:

lastNameagesexcity
Johnson45MNew York
Yamamoto83FTokyo
Smith25MLondon
............

🔍 Part 1:行をフィルターする(tFilterRow)

🎯 フィルター条件:

  • lastName の長さが 9文字未満

  • age10〜80 の間

🛠 条件の設定方法(tFilterRow):

  1. 条件は「すべて満たす必要がある」→ And 条件を選ぶ

  2. 条件を入力:

    • StringHandling.LEN(lastName) < 9

    • age >= 10

    • age <= 80

🔄 出力の2種類:

出力名内容
Filter条件をすべて満たした行
Rejectどれか一つでも条件を満たしていない行(除外)

🧾 tLogRow をつなげて結果を見る
  • Filter 側の出力名:FILTERED_ROWS

  • Reject 側の出力名:REJECTS

💡 Reject 側には「どの条件に合わなかったか」のエラーメッセージ列も追加されるので、「Sync columns」ボタンを押して列構成を合わせるのを忘れずに!


🔁 実行結果(例):

  • 全15件中、8件が Reject

  • たとえば:

    • age = 83 → 範囲外でReject

    • lastName = Yamamoto → 9文字なのでReject(< 9 なので)


🧪 Part 2:列をフィルターする(tFilterColumns)

次に「列(カラム)」をフィルターします。

🔧 tFilterColumns の設定:

  • 取り出したい列だけ選んで残す

  • 列の順番も変更できる

🎯 たとえば:

残したい列の順番
city
lastName
sex
age は使わないから除外!

この出力に対しても tLogRow をつなぎます。出力名は FILTER_COLUMNS に設定。


🧪 実行結果(例):

  • 全15件処理されるが、

  • age は表示されない(フィルター済み)

  • 順番は指定どおりに並んでいる


🧠 補足:他にもあるよ!フィルター手段

今回紹介した以外にも、Talendでは以下のような方法でもフィルターが可能です:

方法用途・特徴
tMap の中でより柔軟な条件設定や変換と組み合わせられる
tJavaRow などJavaコードでフィルターロジックを記述できる

✅ まとめ:どんなときに何を使う?

やりたいこと使うコンポーネント
データの行を条件で絞り込みたいtFilterRow
特定の列だけ取り出したいtFilterColumns
順番を並び替えたいtFilterColumns
複雑な条件や変換も一緒にしたいtMap

Talendでのフィルタリングは、Excelの「フィルター機能」やSQLの WHERESELECT に似ていて、非常に実務で使います!


🎯 ソート

Talendでデータをソート(並び替え)するには?


✅ 使用するコンポーネント

コンポーネント役割
tRowGeneratorテスト用データを自動生成する
tLogRowデータをコンソールに表示
tReplicateデータを複数の流れに分岐させる
tSortRowデータを並び替える(今回の主役!)

💡 ソートの基本ルール

tSortRow では、次のようなソートができます:

  • 数値の並び替え(昇順・降順)

  • 文字列の並び替え(アルファベット順)

  • 日付の並び替え(古い順・新しい順)


🧪 実践例:「sort」ジョブ

① テストデータの生成

まず tRowGenerator で以下のようなサンプルデータを作成します:

numericsstringsdates
72"apple"2001-03-15
13"Zebra"2004-06-21
5"banana"2000-12-01
.........
このデータを tLogRow で一度出力して確認します。

🔁 ステップごとの処理

② データを複製する(tReplicate)

tReplicate を使って、同じデータを3つの流れに分けます:

  • 数値ソート用

  • 文字列ソート用

  • 日付ソート用


🔢 ③ 数値で並び替える(numerics)

  • tSortRow を使って numerics カラムを 昇順 でソート

  • ソート条件の設定は以下の通り:

項目設定内容
カラム名numerics
ソート順昇順 (ascending)
数値 (numeric)

ソート後、tLogRow で表示

ラベル名は「NUMERIC」に変更して、見やすくします。


🔤 ④ 文字列で並び替える(strings)

  • 同じように、strings カラムを昇順でソート(アルファベット順)

  • 注意点:

    • 数字→大文字→小文字の順に並ぶ(ASCII順)

    • 大文字・小文字を無視したい場合は、前処理が必要(例:小文字に変換してからソート)

ラベルは「ALPHA」に変更。


📅 ⑤ 日付で並び替える(dates)

  • dates カラムを**古い順(昇順)**に並べる

  • 年 → 月 → 日の順で比較される

  • ラベル名は「DATES」


🖼 おまけ:ソート条件を表示する方法

tSortRow のソート条件(どのカラムで、どう並び替えているか)を画面に表示させるテクニックも紹介されました。

方法:

  1. tSortRow を開く

  2. ツールチップに出るパラメータ名 __CRITERIA__ を確認

  3. View タブの コメント 欄に __CRITERIA__ を入力

  4. 実行すると、現在のソート条件がラベル上に表示される

→ これで、あとから見ても「このソート何してるんだっけ?」がすぐに分かります!


✅ 実行結果まとめ

  1. NUMERIC:数値が小さい順に表示

  2. ALPHA:文字列がアルファベット順に(ASCIIコード順)

  3. DATES:古い日付から新しい日付へ並び替え


💡 補足:大文字・小文字を無視して並べたいときは?

tSortRow はデフォルトで「大文字・小文字を区別」します。
例えば:

  • "Apple""Zebra""banana"

の順番になります。

対処法:

  • tMapStringHandling.LOWER() などを使ってすべて小文字化してからソート


🧠 まとめ

並び替えたいものソート方法
数値tSortRow で「数値」ソート
文字列tSortRow で「文字列」ソート
日付tSortRow で「日付」ソート
ソート条件を表示したい__CRITERIA__ をコメントに書く

Talendでのソート処理は、Excelの「並び替え」やSQLの ORDER BY と同じような感覚です。
実際の業務でも、レポートや前処理で必ず使います!


🎯 集計

「Talendでデータを集計する方法」
tAggregateRow コンポーネントを使います!


✅ 今回の処理のイメージ

名前点数 (points)
Peter5
James3
Peter6
James7

上のようなデータがあったときに…

👇最終的にはこう集計したい!

名前合計 (sum)平均 (avg)最小 (min)最大 (max)
Peter115.556
James105.037


🔧 使用するTalendコンポーネント

コンポーネント役割
tFixedFlowInputサンプルデータの入力(今回はコピペ)
tAggregateRowデータの集計処理を行う
tLogRow結果をコンソールに表示する


🧪 処理のステップ

① サンプルデータの準備(名前と点数)

「名前(name)」と「点数(points)」という2列のデータを用意します。

namepoints
Peter5
James3
Peter6
James7

このデータを一度 tLogRow で表示して、データがちゃんと流れているか確認します。

tAggregateRow の追加

  • このコンポーネントで実際に集計をします。

  • データをグループ化して、合計・平均・最小・最大を計算できます。


③ スキーマの設定

出力スキーマ(=出力するカラム)を自分で定義します:

カラム名データ型内容
nameStringグループのキー(今回は名前)
sumDouble合計
avgDouble平均
minDouble最小値
maxDouble最大値

すべて Double 型で、「Null可(nullable)」にしてOK。

④ 「グループ化」の設定

  • 「name」列でグループ化します。

  • つまり、「名前ごとに点数をまとめる」イメージです。

👉 Group by の設定:

  • 入力カラム:name

  • 出力カラム:name


⑤ 「集計方法(関数)」の設定

次に、「どんな集計をするか」を Operations タブで設定します:

出力カラム関数入力カラム
sumSumpoints
avgAveragepoints
minMinpoints
maxMaxpoints

関数はプルダウンから選べばOKです。

⑥ 出力と実行

  • 最後に tLogRow に接続して、結果を表示します。

  • 「Sync columns(列の同期)」を忘れずに!

✅ 実行すると:

name | sum | avg | min | max
------------------------------- Peter | 11 | 5.5 | 5 | 6 James | 10 | 5.0 | 3 | 7

💬 補足:Excel・SQL経験者向けにたとえると?

  • Excelで言うと「ピボットテーブル」

  • SQLで言うと:

SELECT name,
SUM(points), AVG(points), MIN(points), MAX(points) FROM table GROUP BY name;

のような処理です!


🧠 まとめ:tAggregateRow の基本

操作内容設定場所
グループ化の列Group by タブ
集計関数の設定Operations タブ
出力列の定義Schema 画面で設定

Talendではドラッグ&ドロップ + ちょっとした設定で、SQLのような処理が簡単にできます。

🎯 データ型変換

Talendでデータの型を変換する方法
(例:文字列→数値、数値→文字列)


🧰 使用するコンポーネント

コンポーネント名役割
tFixedFlowInput入力データを固定で用意する
tConvertTypeデータ型の変換(String → Integer など)
tJavaRowJavaのコードでカスタム変換(Integer → String など)
tLogRow結果を表示する


🧪 数値への変換(String → Integer など)

🧾 データ例(固定の入力)

StringToIntegerIntegerColumnFloatToInteger
"1"123123.4
それぞれの列の型は:
  • StringToInteger:文字列 → 数字に変換したい

  • IntegerColumn:すでに整数(そのままでOK)

  • FloatToInteger:小数 → 整数に変換したい


tConvertType での変換方法

  1. tConvertType を追加して、入力と出力をつなぐ

  2. スキーマ(Schema)を編集」する:

    • 出力側のデータ型をすべて Integer に変更

    • 文字列や小数を Integer に変換する

  3. Auto Cast(自動キャスト)」を有効にすると:

    • Talendが自動で型変換を試みる


📌 注意点①:小数→整数は端数切り捨て

たとえば 123.4123
小数部分は切り捨てられるので、精度が失われる


📌 注意点②:文字列→整数で変換できない場合

例えば "one" という文字列を Integer に変換しようとすると:

  • 変換できずに エラー(Reject) になります

  • tConvertType は変換できなかったデータを別の出力(Reject)として分けてくれます

  • errorCodeerrorMessage も出力可能(何が原因か分かる)


🔁 まとめ

変換元変換先結果備考
"1"1OK(自動変換)文字列 → 整数は成功
"one"×エラー(変換不可)英単語は数値にできない
123.4123OK(端数切り捨て)小数 → 整数:精度に注意


🧪 文字列への変換(Integer → String)

今度は逆に、Integer(数値)String(文字列) に変換してみます。

入力データの例:

Number
67


✅ やり方(tJavaRow を使う)

  1. tJavaRow を使って変換処理を書く

  2. スキーマを編集して、出力カラムの型を String に変更

  3. 「Generate Code」ボタンを押して、ひな形コードを自動生成

  4. 自動生成されたコードを少しだけ編集:

output_row.result = "" + input_row.Number;
  • "" + 数値 で文字列化されます(Javaの基本テク)

  • これで 67"67" に変換されます


🔁 まとめ

変換元変換先方法備考
67"67"tJavaRow使用Javaの文字列連結を活用


🎯 データ分割

Talendでは、1つの入力データを 複数の出力に分ける ことができます。
この動画では、以下の2つの方法でデータを分割しています:

方法コンポーネント内容
行レベルで分割tSplitRow1つの行を、2行に分割する
データ項目ごとに分割tMap同じ行を、目的別に2種類の出力に分ける


🧪 パート①:tSplitRowで行単位に分割

✅ 使う例(最初の入力データ)

clientIDnameclientID2name2
1Alice2Bob

この1行に、2人のクライアント情報が入っています。

→ これを、1人ずつ別々の行に分けたい


🛠 やり方(tSplitRow)

  1. tSplitRow コンポーネントを追加して、tFixedFlowInputと接続

  2. 出力スキーマを作成:

    • 出力に使いたい列だけ設定(例:clientID, name

  3. 分割ルールを設定(例:2行に分ける)

row2.clientID → clientID(1人目)
row2.name → name row2.clientID2 → clientID(2人目) row2.name2 → name

💡「row2」は、tSplitRowに入ってくるデータの名前です。

  1. 結果をtLogRowで表示すると、次のような2行の出力になります:

clientIDname
1Alice
2Bob


🧪 パート②:tMapで情報の種類ごとに分割

✅ 使う例(次の入力データ)

clientIDnameaddressphone
1AliceTokyo, Japan090-1234

この1行を次のように役割別に分けたい
  • 基本情報(clientID, name, address)

  • 連絡先情報(clientID, name, phone)


🛠 やり方(tMap)

  1. tMap コンポーネントを追加し、tFixedFlowInputと接続

  2. 出力を2つ作る(例):

出力名欲しい列
basicclientID, name, address
phoneclientID, name, phone

tMap のエディタを開いて、それぞれの出力に必要な列だけ残す
  1. 「Auto Map(自動マッピング)」を使えば、同じ列名は自動で接続される

  2. 結果をそれぞれ tLogRow で出力:


🖥 出力結果

  1. 元の入力データ

clientIDnameaddressphone
1AliceTokyo090-1234

basic 出力(住所付き)
clientIDnameaddress
1AliceTokyo

phone 出力(電話番号付き)
clientIDnamephone
1Alice090-1234


🧠 最後に:tSplitRow と tMap の違い

目的コンポーネント説明
1つの行 → 複数の行へtSplitRow1行に複数レコードが入っている場合に使用
同じ行 → 項目ごとに複数出力へtMap欲しい情報だけ取り出して分岐させる


✅ まとめ:Talendでのデータ分割

方法コンポーネント使いどころ
行レベル分割tSplitRow1行に複数レコードがある場合(例:client1とclient2)
データ内容で分割tMap同じ行を、役割別や用途別に分けたい場合


🎯 正規化・非正規化

Talendで次の2つを行う方法を学びます。

  • 正規化(Normalize):1行の中にカンマで区切られた複数の値を複数行に分ける

  • 非正規化(De-normalize):複数行に分かれているデータを1行にまとめる


✅ 使用するTalendコンポーネント

処理内容使用コンポーネント補足
正規化(Normalize)tNormalizeカンマなどの区切り文字で行を分割
非正規化(De-normalize)tDenormalize or tDenormalizeSortedRowデータを1行に結合(※ソートされているならSortedRow推奨)


🔧 処理の流れ

1. labels.txt(CSV)読み込み
2. tNormalize:1行に複数あるデータを行ごとに分割 ↓ 3. 重複、空白、空データを削除 ↓ 4. tBufferOutput:一時的にメモリに保存 ↓ 5. tBufferInput:メモリから読み出す ↓ 6. tSortRow:アルファベット順にソート ↓ 7. tDenormalizeSortedRow:1行にまとめ直す ↓ 8. 出力(tLogRow)

📝 実行例:元ファイル labels.txt

例:

java, database, JDBC, database, , ETL

🌱 正規化(tNormalize後)

1行をカンマ区切りでバラバラにして、1項目ずつの行に変換します。

java
database JDBC database ← 重複あり [空白行] ← 空データあり ETL

🧹 整理(Advanced設定)で:

  • 重複削除:✔ get rid of duplicates

  • 空行削除:✔ discard empty strings

  • 前後の空白削除:✔ trim resulting values

結果:

database
ETL JDBC java

🧠 非正規化(tDenormalizeSortedRow後)

最終的なきれいな1行の出力

database,ETL,JDBC,java

💡 補足説明

用語説明
tFileInputFullRowファイルを「1行ずつ」丸ごと読み込む
tNormalize指定の区切り文字で1行を分割(行数を増やす)
tDenormalizeSortedRow同じグループのデータを1行に結合(行数を減らす)
tBufferOutput/Inputメモリに一時保存して後で読み込みたいときに使う
tSortRowデータをソートする(例:アルファベット順)
tLogRow結果をコンソールに出力する(デバッグ確認用)


✅ まとめ

  • 正規化java,database,JDBC
    java / database / JDBC と「行を増やす」

  • 非正規化java / database / JDBC
    java,database,JDBC と「行を減らす」


🎯 データ結合

Talendで2つのデータを結合する方法(tJoinの使い方)


✅ 使うコンポーネント

コンポーネント名役割
tRowGeneratorダミーデータ(顧客情報)を生成する
tFixedFlowInput固定値(国コードと国名の対応表)を入力する
tJoin2つのデータを「共通キー」で結合する
tLogRowデータをコンソールに表示する(確認用)


🗂️ シナリオ:

  • 顧客データ(Clients)に国コード(例:US)がある

  • 国コード一覧(Countries)にコードと国名(例:US → United States)がある

  • この2つを国コードで結合して、国名を追加する!


🔧 処理の手順まとめ(簡易図解)

1. tRowGenerator → 100人の顧客データ(国コード付き)
2. tFixedFlowInput → 国コードと国名の一覧(例:DE→Germany) 3. tJoin → 国コードをキーにして結合 ├─ Main入力 → 顧客データ(左) └─ Lookup入力 → 国名一覧(右) 4. tLogRow → 結果表示(JOINED / REJECT)

🧪 データ例:

顧客データ(tRowGeneratorで生成)

名前国コード
AliceUS
BobDE
CharlieFR
DavidUNKNOWN
EvaN/A

国名一覧(tFixedFlowInput)
国コード国名
USUnited States
DEGermany
FRFrance


🔁 結合設定(tJoin)

  1. 接続順序が大事!

    • 最初にtRowGenerator(Main)→ tJoin

    • 次にtFixedFlowInput(Lookup)→ tJoin

  2. スキーマ設定

    • 顧客側の全列を「←←」ボタンで全コピー

    • 国名(countryName)を「→」ボタンで追加

  3. 結合キーの設定

    • 顧客データの「country」列と
      国名一覧の「countryCode」列をマッチさせる

  4. 出力の設定

    • 「Include lookup columns in output」にチェック

    • 「countryName」に対応する国名を表示させる

  5. 出力の分岐

    • 正常にマッチしたデータ → Main 出力(JOINED)

    • マッチしなかったデータ → Reject 出力(REJECT)


✅ 実行結果の例:

JOINED 出力(成功した結合)

名前国コード国名
AliceUSUnited States
BobDEGermany
CharlieFRFrance

REJECT 出力(マッチしなかったデータ)

名前国コード国名
DavidUNKNOWNnull
EvaN/Anull


⚠️ tJoin の注意点(制限)

  1. 柔軟な処理ができない

    • 例えば「UNKNOWN」は「不明」と表示したい、などの条件分岐ができない
      → そういう場合は tMap を使う

  2. 複数の表(3表以上)を結合できない

    • tJoin は 2つのデータだけを結合可能
      → 多段結合が必要な場合も tMap を使う


💡補足:tJoin と tMap の使い分け

特徴tJointMap
対応件数2つの表だけ複数の表を同時に処理できる
柔軟な処理不可(if文書けない)可能(条件分岐や変換が書ける)
処理スピードtJoinの方が若干速いやや遅いが高機能
向いてる用途シンプルなキー結合複雑なロジックの結合処理


📌 まとめ

  • tJoinを使えば、2つのデータをキーで簡単に結合できる

  • 一致しないデータはREJECT出力に流して分岐処理できる

  • 柔軟な処理が必要なら、次回紹介されるtMapがベター


🎯 Sakilaサンプルデータベースをインストール

MySQLにSakilaというサンプルデータベースをインストールする


🐠 Sakilaってなに?

  • Sakila(サキラ)は、MySQLが提供する練習用のサンプルデータベース

  • 映画レンタル店を想定したデータ構造

    • 主なテーブル:actor, film, film_actor(俳優・映画・対応関係)

  • Talendの学習にも使える有名なデータベース

🔗 公式ページ:https://dev.mysql.com/doc/sakila/en/


🔧 インストール手順まとめ:

✅ 1. ZIPファイルをダウンロード

  • 上記URLの中の「Installation」の項目を開く

  • そこにある「sakila-db.zip」をダウンロードする

    • ZIPファイルの中には以下の2つのSQLファイルが入っている:

      • sakila-schema.sql(データベースの構造)

      • sakila-data.sql(中身のデータ)


✅ 2. ZIPを解凍する

unzip sakila-db.zip
cd sakila-db ls

中に sakila-schema.sqlsakila-data.sql があるのを確認。


✅ 3. MySQLに接続する

ターミナルまたはコマンドプロンプトからMySQLに接続します:

mysql -u ユーザー名 -p

パスワードを聞かれるので入力。


✅ 4. Sakilaを読み込む(2ステップ)

-- 既にある場合は削除(オプション)
DROP DATABASE sakila; -- スキーマを作成 SOURCE sakila-schema.sql; -- データを挿入 SOURCE sakila-data.sql;

これで「sakila」データベースが作成されます!

確認:

SHOW DATABASES;
USE sakila; SHOW TABLES;

✅ 5. TalendでSakilaに接続

Talend内でも使えるように設定します。

ステップ:

  1. 「DB接続」設定をコピー
    既存の接続を右クリック → Duplicate(複製)
    名前を「sakila2」などにしておく

  2. 中のスキーマ(テーブル情報)を削除
    元の複製でついてきたテーブルは削除する

  3. 接続設定を編集

    • 「Database名」を sakila に変更

    • 「Test Connection」で接続確認 → 成功したら「Finish」

  4. スキーマの取り込み(Retrieve Schema)

    • actor, film, film_actor を選択

    • Next → Next → Finish で完了


✅ 最後に

これで「Sakilaデータベース」がMySQLとTalendの両方で使えるようになります。

この後、actorfilmfilm_actor の3つのテーブルを使って
データ結合変換処理などを行っていく予定です。



🎯 複数のテーブル結合

複数のテーブル(映画、俳優、中間テーブル)を1つに結合する(JOIN)


👇 使用するコンポーネント

  • tDBInput × 3:データベースの各テーブルを読み込む

  • tMap:JOIN処理を実行(2つ以上のテーブルを柔軟に結合できる)

  • tFileOutputDelimited:結果をCSVで保存

  • tLogRow:ログに出力


🗂 使用するテーブル(Sakilaデータベース)

テーブル名内容
film映画情報(映画ID、タイトルなど)
actor俳優情報(俳優ID、名前など)
film_actor中間テーブル(映画と俳優の対応)

🔄 JOINの流れ(やさしくステップ解説)

✅ 1. 3つのテーブルをジョブにドラッグ&ドロップ

  • 各テーブルは tDBInput コンポーネントに変換される

  • 名前をわかりやすく変更: film, film_actor, actor

✅ 2. tMap を追加して接続

  • 最初に接続したものが「メイン」

  • 他は「ルックアップ」として処理される(後でJOIN対象になる)

✅ 3. tMap 内でJOIN設定をする

  • film.film_idfilm_actor.film_id を結合(ドラッグでも指定でもOK)

  • 次に film_actor.actor_idactor.actor_id を結合(こちらは手入力)

🔧 JOIN設定の注意点(tMap左上の赤いドットのアイコン):

テーブルJOINの種類結果の種類
film_actorInner Join(全件)すべての一致を出力する
actorInner Join(1件)俳優テーブルはユニークと想定

✅ 4. 出力を作る(Output)

🔹 正常なJOIN結果の出力

  • 出力名:film_actor_joined

  • 出力項目:映画ID、映画タイトル、俳優情報(名、姓、更新日時など)

🔹 JOINできなかったデータの出力(Reject)

  • 出力名:film_actor_join_reject

  • tMap settings で「Catch lookup inner join reject」を true にする


✅ 5. 出力設定

  • JOIN結果 → tFileOutputDelimited(CSVで出力)

    • 出力先:Talend/data/out/film_actor_joined.csv

    • 「Include header」にチェック(ヘッダー行あり)

    • 「Append」ではなく「上書き(再生成)」に設定

  • JOIN失敗 → tLogRow に出力(コンソールで表示)


▶ 実行してみると…

  • データはロードされてJOINされ、CSVファイルが生成される

  • 一部映画は film_actor に対応がない → join_reject に分類される(例:ドキュメンタリー)


🧠 ポイントのまとめ

項目内容
なぜtMaptJoinは2つまでしか結合できない。tMapは3つ以上のJOINや柔軟な条件設定が可能。
JOINの種類の違いUnique match=1対1、All matches=1対多を扱う
Rejectを取る理由結合できなかったデータも検証・記録しておくため
CSV出力の工夫ヘッダーを含める・出力ファイルが既にあればエラーを出さないよう設定

✍ こんなときに使える!

  • 複数テーブルのマスターデータを集約

  • JOIN失敗のログを出力して分析

  • tMapで条件付き変換も一緒にしたいとき


🎯 tMapデータフィルター

JOINされたデータにフィルターをかけて、2つのグループに分けること!

  1. フィルター条件を満たすデータ → 正常データ

  2. フィルター条件に落ちたデータ → フィルターリジェクト(除外データ)


🧱 前回の復習(ベースのジョブ構成)

前の動画で作ったジョブ(mappingJoin)では、

  • 3つのテーブル:film, actor, film_actor

  • tMapでJOIN → 正常なデータ(joined)と、JOINできなかったデータ(join_reject)に分けた


🔄 今回やること

  1. そのジョブを 複製して名前を mappingFilter に変更

  2. 正常なJOINデータ(film_actor_joined)に対して フィルターをかける

  3. 条件に合格したデータfilm_actor_joined_filtered

  4. 条件に落ちたデータfilm_actor_filter_reject


🪜 やることをステップごとに解説


✅ 1. ジョブを複製して名前を変える

  • mappingJoin → コピーして mappingFilter にリネーム

  • ジョブの構成はそのまま使う


✅ 2. 出力コンポーネントを2つに分ける

  • tFileOutputDelimited を2つ用意

    • 1つ目:film_actor_joined_filtered.csv(フィルター合格)

    • 2つ目:film_actor_filter_reject(リジェクトされたやつ)


✅ 3. tMap に新しい出力を追加する

  • 出力①:film_actor_joined_filtered(名前変更)

  • 出力②:film_actor_filter_reject(新規作成)

  • Auto Map を使って、自動でカラムをつなげる


✅ 4. フィルター条件を設定する

  • film_id < 990 の映画だけ通す(1〜989)

  • 990〜1000の映画はフィルターリジェクトへ

🛠 フィルターの設定方法:

  • 出力①の右上のボタン → フィルター有効化ボタン(小さな「ƒx」みたいなやつ)をクリック

  • 条件に:film_id < 990


✅ 5. フィルターに落ちたデータをキャッチする設定

  • 出力②(リジェクト側)の設定を開いて、

  • tMap SettingsCatch output rejecttrue にする

☝ 補足:
「filter reject」ではなく「output reject」と書かれてるけど、意味は「フィルターに落ちたやつを拾う」ってことです。


✅ 6. 実行!

  • ジョブを実行すると:

    • JOIN後のデータがフィルターされて2つに分かれる

      • 例:フィルター合格(ID 1〜989)→ film_actor_joined_filtered.csv

      • 例:リジェクト(ID 990〜1000)→ film_actor_filter_reject に出力

  • 実際に出力ファイルを見て確認!


🧠 まとめ

目的内容
やりたいことJOINした後に「条件に合う/合わない」で2つに分ける
どうやって?tMapフィルター機能Reject機能 を使う
条件はどこで書くの?出力の「ƒx」マークのところで film_id < 990 を設定
フィルターに落ちたデータは?Catch output reject をオンにすることで拾える
出力の使い分け合格 → CSVファイル(正常出力)、不合格 → ログや別ファイル(リジェクト出力)

🎯 tMapデータの変換(整形)

🧩 問題:

  • actor テーブルの名前や film のタイトルが すべて大文字(例:GARY PHOENIX)

  • これを「最初の文字だけ大文字、残りは小文字(例:Gary Phoenix)」に変換したい。


✅ 基本方針

❓ どこで変換するの?

  • 実際にJOINする tMap の中では変換しない

  • 先に actor データだけを 別の tMap で変換してからJOINする。


🤔 なぜ変換を分けるの?

  1. JOIN用のtMapがごちゃごちゃになるのを防ぐため

  2. actor テーブルは たった200件しかない
     → それをJOINごとに毎回変換するのは 非効率


🪜 手順をやさしくステップで解説


✅ 1. 既存ジョブを複製する

  • mappingFilter などの前のジョブをコピー

  • 新しいジョブ名:mappingTransform


✅ 2. tMapコンポーネントを追加

  • actor テーブルの出力とJOINの間に、新しい tMap を追加

actor → tMap(変換)→ JOIN用のtMapへ接続

✅ 3. 変換用tMapの設定

  • 入力列: actor_id, first_name, last_name, last_update

  • 出力列:同じカラム構成(Auto Map ボタンで自動連携)

  • first_name, last_name を変換する

変換方法(例:first_name)

row1.first_name.substring(0, 1)
+ row1.first_name.substring(1).toLowerCase()

✅ 最初の1文字はそのまま(大文字)
✅ 2文字目以降を toLowerCase() で小文字化

last_name も同じ方法で変換


✅ 4. テストして確認する

  • tMap の中で「Test」ボタンを使って変換が正しくできるか確認できる


✅ 5. 実行して結果を確認

  • 実行すると…

    • actor テーブルが最初に読み込まれ、変換される

    • JOIN処理でその変換後の名前が使われる

  • 出力ファイルでは、きちんと名前が整形された状態で出てくる


🎉 結果例

元の名前変換後
GARY PHOENIXGary Phoenix
MARY SMITHMary Smith
TOMMY LEE JONESTommy Lee Jones

🧠 まとめ

内容説明
なにをする?すべて大文字の名前を「最初だけ大文字、他は小文字」に変換する
どこで変換?JOIN前に、actor テーブルだけ別の tMap で変換
なぜ別にしたの?毎回変換すると効率が悪いし、JOINの tMap がごちゃごちゃになるため
方法は?substring()toLowerCase() を組み合わせて変換
テストできる?tMap の中の「Test」機能で事前に変換結果を確認できる


🎯 「fieldExtract」ジョブの導入と準備

この動画では、本題に入る前の準備として、
以下のような処理の「枠組み(テンプレート)」を作ります:


🗂 やることまとめ(ざっくり)

処理の流れ内容
1️⃣ tPreJob処理の最初に一度だけ実行する準備処理(データ作成)
2️⃣ Main処理ダミーデータを作り、4種類のファイル形式で出力
3️⃣ tPostJob処理の最後に、作成したファイルを削除する後処理

🛠 使用する主なコンポーネント

コンポーネント名役割
tPreJob / tPostJobジョブの前後に一度だけ実行される処理
tRowGeneratorテスト用のダミーデータを生成する
tReplicateデータを複数の出力に分岐する
tFileOutputJSONJSONファイルに出力
tFileOutputXMLXMLファイルに出力
tFileOutputPositional固定長(位置決め)ファイルに出力
tFileOutputDelimitedCSVなどの区切り付きファイルに出力
tFileListファイル一覧を取得する
tFileDeleteファイルを削除する
tSleep(一時的に使用)一瞬だけ処理を待つ(1秒)← 作成→削除の確認用

🧪 実装ステップ(やさしく解説)


✅ ステップ1:前処理(tPreJob)

📌 目的:ダミーデータを1件作る

  • データ内容は:

    • name(例:自分の名前)

    • email(例:自分のメール)

    • birthday(日付)

💡 データ生成方法(tRowGenerator)

  • birthdayDate 型にして、 TalendDate.parseDate("yyyy-MM-dd", "1980-01-01") のように入力

  • 「Preview」ボタンでちゃんとデータが出るか確認できる

  • 件数は「1件」に変更する(デフォルトだと100件になってる)


✅ ステップ2:ファイル形式で出力(tReplicateと各種tFileOutput)

出力形式ファイル名例特記事項
JSONdata.json-
XMLdata.xml-
固定長data.txt各列の長さを指定(例:50, 50, 10)
CSVdata.csv-

📌 出力先の指定
  • context.outputDir というコンテキスト変数を使って保存先を指定

    • 例:context.outputDir + "data.json" のように書く


✅ ステップ3:後処理(tPostJob)

📌 目的:生成した4つのファイルを最後に削除する

  • tFileList で出力先フォルダをスキャン

  • tFileDelete.json などのファイルを削除

⚠️ 注意点!

  • filemask(ファイル名マスク)を忘れると危険!

    • 指定しないと フォルダ内すべてのファイルが削除されてしまう!

    • 例: *.json, *.csv などを filemask に設定するのが正解

    • 講師も一度間違えて全部削除してしまった様子(人間らしい…)


✅ ステップ4:tSleep(削除前に一瞬待つ)

  • 実行結果を目で確認するため、1秒だけ待つ tSleeptPreJobtPostJob の間に一時追加

  • 後で削除OK(確認用の仮処理)


🧾 実行結果のイメージ

📁 output/
├── data.json ← JSON形式で出力 ├── data.xml ← XML形式で出力 ├── data.txt ← 固定長ファイル └── data.csv ← 区切り付き(CSV) → すぐに tPostJob が発動して、これらを削除

🧠 補足:コンテキスト変数の使い方

  • 変数を書くときは context. と打つ

  • 途中で [Ctrl] + [Space] を押すと候補一覧が出てくる!

  • たとえば:

    context.outputDir + "data.json"

🎉 次回予告

このジョブの「テンプレート」が完成したので、
次からは「個別の抽出処理(field extract)」を各形式(JSON, XMLなど)ごとに解説していく流れです。


✋ まとめ

処理内容
tPreJobダミーデータを作成
メイン部同じデータを4形式で出力
tPostJob最後に出力ファイルを削除
ポイントfilemask 忘れに注意!

🎯  TalendでJSONフィールドを抽出

この動画では、Talendの tExtractJSONFields コンポーネントを使ってJSONから必要な情報を取り出すやり方を説明します。
この処理は「fieldExtract」というシナリオの中のサブジョブ「JSON extract」で行います。


🔹 1. JSONを1行の文字列として読み込む

  • tFileInputDelimitedコンポーネントでJSONファイルを1つの文字列カラムとして読み込みます。

  • スキーマは「data」という1カラムだけを作成。

  • 区切り文字は使わず、行区切りだけを指定します。

  • 読み込んだら、tLogRowでコンソールにテーブル形式で表示。

  • すると、「data」カラムにJSON全文が入っているのが見えます。


🔹 2. JSON文字列から必要なフィールドを抽出する

  • tExtractJSONFieldsコンポーネントを使います。

  • 入力は「data」カラムが自動設定されています。

  • 出力スキーマは先ほど作ったスキーマ(name, email, birthday)をコピー&ペースト。

  • JSONのルート要素は "data" なので、JSONパスは $.data[*] と指定。

    • $ はルート

    • data はルートのキー名

    • [*] は配列内すべての要素を意味します。

  • フィールド名はJSONのキー名と大文字・小文字も含めて完全一致で書きます。


🔹 3. エラー処理と出力設定

  • tExtractJSONFieldsには2つの出力があります。

    • 正常にパースできたデータ → JSON_OUT

    • エラーが発生したデータ(Reject) → JSON_REJECT

  • それぞれの出力に分けて名前をつけて扱います。


🔹 4. ジョブの名前を付けて実行

  • サブジョブ全体に名前をつけます → JSON extract

  • ジョブを実行するとコンソールに元のJSON文字列と抽出結果が表示されます。

  • エラーがなければ JSON_REJECTは空になります。


📝まとめ

📌 項目内容
📥 JSON読み込みtFileInputDelimitedで1列の文字列として読み込み
⚙️ 抽出コンポーネントtExtractJSONFieldsを使用
🔍 JSONパス指定ルートは $.data[*]
🏷️ 抽出カラム名JSONファイルのキー名と完全一致が必須(大文字小文字も)
📤 出力正常出力(JSON_OUT)とReject出力(JSON_REJECT)に分ける
▶️ 実行結果抽出されたフィールドがコンソールに表示される

🎯 TalendでXMLフィールドを抽出

この動画では、Talendの tExtractXMLFields コンポーネントを使ってXMLから必要な情報を取り出す方法を説明します。
これは「fieldExtract」というシナリオの中のサブジョブ「XML extract」で行います。


🔹 1. 既存のJSON抽出ジョブをコピーして準備

  • 既に作ってあるJSON抽出のサブジョブをまるごとコピーします(Ctrl+CCtrl+V)。

  • コピーしたものを「XML extract」と名前変更し、動く順番を「On Subjob Ok」でつなげます。

  • これでJSONの次にXML抽出が実行されるようになります。


🔹 2. XML入力ファイルの読み込み設定

  • XMLは複数行で構成されているので、行区切りは使わず、ファイル全体を1つの文字列として読み込む設定にします。

  • 読み込むファイルはXMLファイルに変更。

  • 読み込みカラム名は「XML_IN」など分かりやすい名前に変えます。

  • コンソール出力用のラベルも「XML_IN」「XML_OUT」「XML_REJECT」と変更。


🔹 3. tExtractXMLFieldsの設定

  • tExtractJSONFieldsは使わず、代わりに tExtractXMLFieldsコンポーネントを使います。

  • 出力スキーマは既存のスキーマをコピー&ペーストで設定(name, email, birthday)。

  • メイン出力は「XML_OUT」、エラー(Reject)出力は「XML_REJECT」に接続します。


🔹 4. XMLパス(XPath)の設定

  • ループさせるパスは /root/row に設定します。
    → XMLの中で、rootタグの中の複数のrow要素に繰り返しアクセスするイメージです。

  • フィールド名はXML内のタグ名と同じに設定(name, email, birthday)。

  • 大文字小文字も正確に合わせましょう。


🔹 5. 実行してエラー調整

  • 最初に実行するとReject側のスキーマが違うなどのエラーが出るので、
    「Sync columns」(スキーマの同期)ボタンを押して修正。

  • 再実行すると、コンソールにXML全体の文字列と抽出したフィールドが表形式で表示されます。

  • エラー(Reject)データはなしで成功。


📝まとめ

📌 項目内容
📥 XML読み込み複数行あるため、1カラム1行の文字列として読み込む設定にする
⚙️ 抽出コンポーネントtExtractXMLFieldsを使う
🔍 ループパス(XPath)/root/row(XMLの構造に合わせて設定)
🏷️ 抽出フィールド名XMLタグの名前と完全一致で指定する
📤 出力成功出力(XML_OUT)とReject出力(XML_REJECT)に分ける
▶️ 実行結果抽出したフィールドがコンソールに表示される

🎯 Talendで「固定長(Positional)フィールド」を抽出

この動画では、Talendの tExtractPositionalFields コンポーネントを使って、
固定長フォーマットのデータからフィールドを取り出す方法を紹介します。
これは「fieldExtract」シナリオの中の「positional extract」というサブジョブで行います。


🔹 1. サブジョブのコピーと準備

  • 既にあるサブジョブ(例:JSON抽出)を選択して、Ctrl+Cでコピー。

  • 下の方に移動して、Ctrl+Vでペースト。

  • 「コンポーネントの自動リネーム」を確認して「はい」をクリック。

  • ペーストしたサブジョブの名前を「POSITIONAL extract」に変更。

  • コンソール表示用のラベル(tLogRowのラベル)も「POSITIONAL」に変更。


🔹 2. ファイル入力の設定

  • 読み込むファイル名は "data.txt" に設定。

  • 行区切り(row separator)は設定するが、フィールド区切り(field separator)は無しでOK。

  • まずはこのファイルの内容をコンソールに表示して確認。


🔹 3. 抽出コンポーネントの設定

  • 今回使うのは tExtractPositionalFields

  • 「data」という1つのフィールドに格納された文字列を解析します。

  • スキーマ(取り出すフィールドの構造)を設定。

    • 既存のスキーマをコピー&ペーストして使います。

  • 抽出パターン(固定長の長さ)は、例えば「50,50,10」のようにカンマ区切りで設定。

    • これはフィールドの長さが50文字、50文字、10文字という意味です。


🔹 4. 便利なオプション

  • 「Trim column(トリム)」にチェックを入れると、

    • フィールドの後ろに余分に付いているスペースを自動的に削除してくれます。


🔹 5. 出力の設定と実行

  • メイン出力は「POSITIONAL_OUT」、エラー出力は「POSITIONAL_REJECT」に接続。

  • 両方のスキーマを「Sync columns」で同期させる。

  • ジョブを実行すると、

    • 元の固定長テキストがコンソールに表示され、

    • 解析されたフィールドがスペースなしでキレイに表示される。

    • エラー(Reject)は無し。


📝 まとめ

📌 項目内容
📥 入力ファイルdata.txt(固定長フォーマットのテキストファイル)
⚙️ 抽出コンポーネントtExtractPositionalFields
📊 パターン指定例:50,50,10(フィールドの文字数をカンマ区切りで指定)
✂️ トリム設定余分なスペースを削除するオプション
📤 出力正常出力「POSITIONAL_OUT」、エラー出力「POSITIONAL_REJECT」
▶️ 実行結果固定長フィールドがきれいに分割され、表示される

🎯 Talendで「区切り文字付き(Delimited)」を抽出

この動画では、Talendの tExtractDelimitedFields コンポーネントを使って、
区切り文字付きのデータ(例:CSV形式)からフィールドを取り出す方法を紹介します。
これは「fieldExtract」シナリオの中の「DELIMITED extract」というサブジョブで行います。


🔹 1. サブジョブのコピーと準備

  • 既にある「positional extract」サブジョブを選択し、Ctrl+Cでコピー。

  • 下の方に移動して、Ctrl+Vでペースト。

  • ペーストしたサブジョブのトリガーを「On Subjob Ok」でつなげて順番に実行。

  • サブジョブの名前を「DELIMITED extract」に変更。

  • コンソール表示用のラベル(tLogRowのラベル)を「DELIMITED_IN」「DELIMITED_OUT」「DELIMITED_REJECT」に変更。


🔹 2. ファイル入力の設定

  • 読み込むファイル名は "*.csv" 形式に変更(例:data.csv)。

  • このCSVファイルはセミコロン(;)で区切られたデータ。

  • まずはファイルの内容をコンソールに表示して確認。

  • 問題なければ、抽出コンポーネントを使って処理。


🔹 3. 抽出コンポーネントの設定

  • tExtractDelimitedFields コンポーネントを設置し、前のtLogRowから接続。

  • スキーマ(取り出すフィールドの構造)をコピー&ペーストで設定。

  • メイン出力を「DELIMITED_OUT」、エラー出力を「DELIMITED_REJECT」に接続。

  • 「Field separator(区切り文字)」はセミコロン(;)のままでOK。

  • 入力のカラムは「data」という1つの文字列だけ。


🔹 4. 実行して確認

  • ジョブを実行し、コンソールで出力を確認。

  • 「name」「email」「birthday」の3つのフィールドにキレイに分かれていることが確認できる。


📝 まとめ

📌 項目内容
📥 入力ファイルCSV形式のファイル(例:data.csv)
⚙️ 抽出コンポーネントtExtractDelimitedFields
📊 区切り文字設定セミコロン(;)
📤 出力正常出力「DELIMITED_OUT」、エラー出力「DELIMITED_REJECT」
▶️ 実行結果区切り文字で分割されたフィールドがきれいに表示される

🎯 Talendで「正規表現(Regex)でフィールドを抽出

この動画では、Talendの tExtractRegexFields コンポーネントを使い、
正規表現(Regex)で文字列を分解・抽出する方法を紹介します。


🔍 正規表現(Regex)とは?

  • プログラミングでよく使われる文字列のパターンマッチング技術です。

  • 複雑な文字列から必要な部分だけを効率よく抜き出すことができます。

  • Talendでも使えて、データの細かい抽出ができる強力な機能です。


1️⃣ サブジョブの準備

  • 既存の「DELIMITED extract」などがある場所に、「REGEX extract」という新しいサブジョブを作ります。

  • 既存サブジョブをコピー&ペーストし、名前を「REGEX extract」に変更。

  • 「Reject」出力は今回は使わないので削除します。

  • それぞれの tLogRow コンポーネントのラベルも「REGEX_IN」「REGEX_OUT」「REGEX_REJECT」に変更。


2️⃣ データファイルの設定

  • 使うファイルは同じCSVファイル(例:data.csv)。

  • このファイルを1行の文字列としてコンソールに表示し確認。

  • 区切り文字の代わりに正規表現でデータを分解します。


3️⃣ 正規表現の設定

  • 正規表現パターンは、メモコンポーネントなどに保存しているものを使うと便利。

  • tExtractRegexFields コンポーネントを追加し、正規表現パターンを「Regex」欄にペースト。

  • 入力は「data」という1カラムの文字列。

  • 出力スキーマは、既存の出力コンポーネントからコピーして設定。


4️⃣ 実行と確認

  • ジョブを実行すると、正規表現に従ってデータが3つのカラムにきれいに分割されているのがわかります。

  • tExtractDelimitedFieldsと同じように分割されていますが、仕組みは違います。


5️⃣ メールアドレスをさらに分割してみる

  • さらに、メールアドレスだけを3つに細かく分割する例を紹介。

  • 既存の正規表現をコピーして別の tExtractRegexFields にペースト。

  • 「Field to split(分割対象フィールド)」を「email」に設定。

  • スキーマを編集し、メールの3部分「emailUser(ユーザー名)」「emailDomain(ドメイン)」「emailTLD(トップレベルドメイン)」を追加。

  • 実行すると、メールアドレスが3カラムに分かれて表示されます。


📝 まとめ

📌 ポイント内容
🛠 使用コンポーネントtExtractRegexFields
🔍 目的正規表現で複雑な文字列をパターンで分割し抽出
📂 入力ファイルCSVファイル(例:data.csv)
⚙️ 正規表現パターンメモに保存しておくと便利
🧩 出力カラム例:name, email, birthday
✨ 応用メールアドレスをユーザー名・ドメイン・TLDに細分化

🎯Talendで「XMLとJSONフィールドを生成する」

Talendのジョブ「fieldCreate」を使って、

  • tWriteXMLField

  • tWriteJSONField

のコンポーネントで、XMLとJSONの構造を作る方法を学びます。


🛠 ジョブの構成イメージ

  • 3つのカラム(列)のデータが1行だけあります。
    例:

    • ランダムなID

    • 現在の日付

    • 固定の名前

  • それを「tWriteXMLField」と「tWriteJSONField」に渡して、それぞれXML・JSONの構造を作成。

  • 出力はコンソールに表示します。


📝 実際の手順

  1. データ準備

    • tFixedFlowInputコンポーネントに3つのカラムを用意します。

    • tLogRowコンポーネントをつなげて、生成されるデータをコンソールで確認できるようにします。

    • 表示モードは「Table」に切り替えます。

  2. データの複製(リプリケート)

    • tReplicateコンポーネントを使い、データを2つに分けます。

    • 片方を tWriteJSONFieldに、もう片方をtWriteXMLFieldに渡します。

  3. JSONの設定(tWriteJSONField)

    • スキーマ編集で、出力は1つの文字列(String)として受け取ります。名前はjsonStringなど。

    • JSONツリー設定を開き、ルートタグ(rootTag)にサブ要素としてpersonを追加。

    • personはループ要素に設定します(複数のpersonが繰り返す想定)。

    • 3つのカラムをpersonの子要素として割り当てます。

  4. XMLの設定(tWriteXMLField)

    • スキーマは1列で型は「Document」(XMLのドキュメント型)。名前はxmlFieldなど。

    • XMLツリー設定で、JSONのときと同じくpersonをサブ要素に追加し、ループ要素に設定。

    • 3つのカラムをpersonの子要素として配置します。

  5. コンソール表示

    • JSON出力用とXML出力用にそれぞれ tLogRowをつなぎ、モードは「Table」に設定。

    • ラベルも分かりやすく「JSON」「XML」に変更。

  6. ジョブの実行

    • ジョブを実行すると、コンソールにJSON形式の文字列とXML形式の文字列が表示されます。


📝 まとめ

  • TalendのtWriteJSONFieldtWriteXMLFieldは、複数のカラムを元に、それぞれの形式の文字列を簡単に作れるコンポーネントです。

  • JSONやXMLのツリー構造はGUIで簡単に設定でき、ループ要素の指定も可能。

  • 出力は1列の文字列データとして扱います。

  • コンソール表示で実際の生成データを確認できるので、動作確認が簡単です。



🎯Talendで「サンプルデータを生成する」

  • tRowGenerator を使って大量のデータを作る

  • tSampleRow でその中から一部だけを抽出して表示する

  • tFixedFlowInput で少数のデータを作成し、

  • tMemorizeRows で特定の1行をメモリに保存し、2通りの方法でコンソールに表示する


🛠 ジョブの全体イメージ

1. 大量データの生成と一部抽出

  • tRowGenerator

    • 他の例で使った設定と同じで、今回は10万行を作成。

    • 生成したデータはメモリに保存(tBufferOutputを使っているイメージ)。

  • tSampleRow

    • 10万件の中からごく一部の行だけ抽出(例:20〜22行目、5行目、18行目など)してコンソールに表示。

  • 結果として、10万件作ったけど、コンソールには5件だけ表示される。

  • 大量データから一部だけ確認したい時に便利。


2. 少数のデータ作成と1行のメモリ保存・表示

  • tFixedFlowInput

    • 2つのカラム「countryCode(国コード)」と「countryName(国名)」で数行データを固定的に作成。

  • データをメモリに保存(tBufferOutputのようなイメージ)。

  • tMemorizeRows

    • ここで1行だけをメモリ(globalMap)に保存。

    • インデックス0(最初の行)で保存。

  • メモリに保存したデータの取得方法は2つある:

    1. Javaコードを使う方法

      • System.out.println()で文字列と一緒に、globalMapからcountryCodecountryNameを取り出してコンソール表示。

    2. tFixedFlowInputを使う方法

      • tFixedFlowInputで新たに3カラムを作り、1つは説明文「memorized row」、あとの2つはglobalMapからの国コードと国名をセット。

      • これをまた tLogRowでコンソール表示。


📝 動作イメージまとめ

  • まず10万件の大量データを作り、5件だけコンソールに表示できた。

  • 次に少数データで1行だけをメモリに保存し、

  • それをJavaコードとTalendのコンポーネントの2通りで取り出し表示した。

  • 出力結果はコンソールに表示されるので確認しやすい。


🎯 Talendで「データをピボット(列変換)する」

  • Talendの tPivotToColumnsDelimited コンポーネントを使って、CSVファイルのデータをピボット変換する方法を学ぶ。

  • 入力ファイル「pivot.csv」は、IDが繰り返し出てくる形で、質問と回答が縦に並んでいる。

  • これをIDごとに「質問(列)」が広がる形に変換(ピボット)して、横に展開したCSVファイルを作成する。


🛠 具体的な処理の流れ

1. 入力ファイルの設定

  • ファイル名は「pivot.csv」。

  • カラムは「id(ID)」「question(質問)」「answer(回答)」の3つ。

  • 例:IDごとに「性別」「結婚」「年齢」の質問と回答が並んでいる。


2. tPivotToColumnsDelimitedの設定

  • 出力ファイル名は「pivotOut.csv」として指定。

  • ピボットの設定をする:

    • Pivot Column(ピボットする列)question(質問の列)

    • Aggregation Column(集約する列)answer(回答の列)

    • Aggregation Function(集約関数)last(最後の値を使う)

    • Group By(グループ化の列)id(IDでグループ化する)


3. 処理の結果

  • 入力では12行あったデータが、IDごとに3行にまとめられた。

  • 各IDについて、「性別」「結婚」「年齢」の回答がそれぞれ別の列になっている。

  • 例えば、「Jean」は「f(女性)」「no(未婚)」「23歳」などがそれぞれの列に。


✔️ まとめ

  • Talendで縦に長いデータを横に広げたい時に、tPivotToColumnsDelimitedを使うと簡単にできる!

  • 「ピボット列」「集約列」「グループ化列」の3つのポイントを正しく設定することが重要。

  • 出力ファイルを指定すれば、変換結果がCSVファイルとして保存される。


前の記事:Talend変数など

次の記事:Talend データ品質改善について