🎯 フィルター
Talendでデータをフィルター(絞り込み)する方法は?
👇 使う主なコンポーネント
コンポーネント名 | 役割 |
---|---|
tFilterRow | 特定の条件で「行(レコード)」をフィルターする |
tFilterColumns | 「列(カラム)」を選んで残したり、並び替えたりできる |
tLogRow | 結果をコンソールに表示する |
tFixedFlowInput | テスト用の固定データを作る |
🧪 サンプルジョブ名:「filter」ジョブ
ステップ①:テストデータの準備
-
tFixedFlowInput
で、次のようなデータを作ります:
lastName | age | sex | city |
---|---|---|---|
Johnson | 45 | M | New York |
Yamamoto | 83 | F | Tokyo |
Smith | 25 | M | London |
... | ... | ... | ... |
🔍 Part 1:行をフィルターする(tFilterRow)
🎯 フィルター条件:
-
lastName
の長さが 9文字未満 -
age
が 10〜80 の間
🛠 条件の設定方法(tFilterRow):
-
条件は「すべて満たす必要がある」→
And
条件を選ぶ -
条件を入力:
-
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の WHERE
や SELECT
に似ていて、非常に実務で使います!
🎯 ソート
Talendでデータをソート(並び替え)するには?
✅ 使用するコンポーネント
コンポーネント | 役割 |
---|---|
tRowGenerator | テスト用データを自動生成する |
tLogRow | データをコンソールに表示 |
tReplicate | データを複数の流れに分岐させる |
tSortRow | データを並び替える(今回の主役!) |
💡 ソートの基本ルール
tSortRow
では、次のようなソートができます:
-
数値の並び替え(昇順・降順)
-
文字列の並び替え(アルファベット順)
-
日付の並び替え(古い順・新しい順)
🧪 実践例:「sort」ジョブ
① テストデータの生成
まず tRowGenerator
で以下のようなサンプルデータを作成します:
numerics | strings | dates |
---|---|---|
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
のソート条件(どのカラムで、どう並び替えているか)を画面に表示させるテクニックも紹介されました。
方法:
-
tSortRow
を開く -
ツールチップに出るパラメータ名
__CRITERIA__
を確認 -
View
タブのコメント
欄に__CRITERIA__
を入力 -
実行すると、現在のソート条件がラベル上に表示される
→ これで、あとから見ても「このソート何してるんだっけ?」がすぐに分かります!
✅ 実行結果まとめ
-
NUMERIC:数値が小さい順に表示
-
ALPHA:文字列がアルファベット順に(ASCIIコード順)
-
DATES:古い日付から新しい日付へ並び替え
💡 補足:大文字・小文字を無視して並べたいときは?
tSortRow
はデフォルトで「大文字・小文字を区別」します。
例えば:
-
"Apple"
→"Zebra"
→"banana"
の順番になります。
対処法:
-
tMap
でStringHandling.LOWER()
などを使ってすべて小文字化してからソート
🧠 まとめ
並び替えたいもの | ソート方法 |
---|---|
数値 | tSortRow で「数値」ソート |
文字列 | tSortRow で「文字列」ソート |
日付 | tSortRow で「日付」ソート |
ソート条件を表示したい | __CRITERIA__ をコメントに書く |
Talendでのソート処理は、Excelの「並び替え」やSQLの ORDER BY
と同じような感覚です。
実際の業務でも、レポートや前処理で必ず使います!
🎯 集計
「Talendでデータを集計する方法」
→tAggregateRow
コンポーネントを使います!
✅ 今回の処理のイメージ
名前 | 点数 (points) |
---|---|
Peter | 5 |
James | 3 |
Peter | 6 |
James | 7 |
👇最終的にはこう集計したい!
名前 | 合計 (sum) | 平均 (avg) | 最小 (min) | 最大 (max) |
---|---|---|---|---|
Peter | 11 | 5.5 | 5 | 6 |
James | 10 | 5.0 | 3 | 7 |
🔧 使用するTalendコンポーネント
コンポーネント | 役割 |
---|---|
tFixedFlowInput | サンプルデータの入力(今回はコピペ) |
tAggregateRow | データの集計処理を行う |
tLogRow | 結果をコンソールに表示する |
🧪 処理のステップ
① サンプルデータの準備(名前と点数)
「名前(name)」と「点数(points)」という2列のデータを用意します。
name | points |
---|---|
Peter | 5 |
James | 3 |
Peter | 6 |
James | 7 |
tLogRow
で表示して、データがちゃんと流れているか確認します。② tAggregateRow
の追加
-
このコンポーネントで実際に集計をします。
-
データをグループ化して、合計・平均・最小・最大を計算できます。
③ スキーマの設定
出力スキーマ(=出力するカラム)を自分で定義します:
カラム名 | データ型 | 内容 |
---|---|---|
name | String | グループのキー(今回は名前) |
sum | Double | 合計 |
avg | Double | 平均 |
min | Double | 最小値 |
max | Double | 最大値 |
Double
型で、「Null可(nullable)」にしてOK。④ 「グループ化」の設定
-
「name」列でグループ化します。
-
つまり、「名前ごとに点数をまとめる」イメージです。
👉 Group by
の設定:
-
入力カラム:
name
-
出力カラム:
name
⑤ 「集計方法(関数)」の設定
次に、「どんな集計をするか」を Operations
タブで設定します:
出力カラム | 関数 | 入力カラム |
---|---|---|
sum | Sum | points |
avg | Average | points |
min | Min | points |
max | Max | points |
⑥ 出力と実行
-
最後に
tLogRow
に接続して、結果を表示します。 -
「Sync columns(列の同期)」を忘れずに!
✅ 実行すると:
💬 補足:Excel・SQL経験者向けにたとえると?
-
Excelで言うと「ピボットテーブル」
-
SQLで言うと:
のような処理です!
🧠 まとめ:tAggregateRow
の基本
操作内容 | 設定場所 |
---|---|
グループ化の列 | Group by タブ |
集計関数の設定 | Operations タブ |
出力列の定義 | Schema 画面で設定 |
🎯 データ型変換
Talendでデータの型を変換する方法
(例:文字列→数値、数値→文字列)
🧰 使用するコンポーネント
コンポーネント名 | 役割 |
---|---|
tFixedFlowInput | 入力データを固定で用意する |
tConvertType | データ型の変換(String → Integer など) |
tJavaRow | Javaのコードでカスタム変換(Integer → String など) |
tLogRow | 結果を表示する |
🧪 数値への変換(String → Integer など)
🧾 データ例(固定の入力)
StringToInteger | IntegerColumn | FloatToInteger |
---|---|---|
"1" | 123 | 123.4 |
-
StringToInteger
:文字列 → 数字に変換したい -
IntegerColumn
:すでに整数(そのままでOK) -
FloatToInteger
:小数 → 整数に変換したい
✅ tConvertType
での変換方法
-
tConvertType
を追加して、入力と出力をつなぐ -
「スキーマ(Schema)を編集」する:
-
出力側のデータ型をすべて
Integer
に変更 -
文字列や小数を
Integer
に変換する
-
-
「Auto Cast(自動キャスト)」を有効にすると:
-
Talendが自動で型変換を試みる
-
📌 注意点①:小数→整数は端数切り捨て
たとえば 123.4
→ 123
小数部分は切り捨てられるので、精度が失われる。
📌 注意点②:文字列→整数で変換できない場合
例えば "one"
という文字列を Integer に変換しようとすると:
-
変換できずに
エラー(Reject)
になります -
tConvertType
は変換できなかったデータを別の出力(Reject)として分けてくれます -
errorCode
やerrorMessage
も出力可能(何が原因か分かる)
🔁 まとめ
変換元 | 変換先 | 結果 | 備考 |
---|---|---|---|
"1" | 1 | OK(自動変換) | 文字列 → 整数は成功 |
"one" | × | エラー(変換不可) | 英単語は数値にできない |
123.4 | 123 | OK(端数切り捨て) | 小数 → 整数:精度に注意 |
🧪 文字列への変換(Integer → String)
今度は逆に、Integer(数値)
→ String(文字列)
に変換してみます。
入力データの例:
Number |
---|
67 |
✅ やり方(tJavaRow
を使う)
-
tJavaRow
を使って変換処理を書く -
スキーマを編集して、出力カラムの型を
String
に変更 -
「Generate Code」ボタンを押して、ひな形コードを自動生成
-
自動生成されたコードを少しだけ編集:
-
"" + 数値
で文字列化されます(Javaの基本テク) -
これで
67
→"67"
に変換されます
🔁 まとめ
変換元 | 変換先 | 方法 | 備考 |
---|---|---|---|
67 | "67" | tJavaRow 使用 | Javaの文字列連結を活用 |
🎯 データ分割
Talendでは、1つの入力データを 複数の出力に分ける ことができます。
この動画では、以下の2つの方法でデータを分割しています:
方法 | コンポーネント | 内容 |
---|---|---|
行レベルで分割 | tSplitRow | 1つの行を、2行に分割する |
データ項目ごとに分割 | tMap | 同じ行を、目的別に2種類の出力に分ける |
🧪 パート①:tSplitRowで行単位に分割
✅ 使う例(最初の入力データ)
clientID | name | clientID2 | name2 |
---|---|---|---|
1 | Alice | 2 | Bob |
→ これを、1人ずつ別々の行に分けたい!
🛠 やり方(tSplitRow)
-
tSplitRow
コンポーネントを追加して、tFixedFlowInput
と接続 -
出力スキーマを作成:
-
出力に使いたい列だけ設定(例:
clientID
,name
)
-
-
分割ルールを設定(例:2行に分ける)
💡「row2」は、tSplitRowに入ってくるデータの名前です。
-
結果を
tLogRow
で表示すると、次のような2行の出力になります:
clientID | name |
---|---|
1 | Alice |
2 | Bob |
🧪 パート②:tMapで情報の種類ごとに分割
✅ 使う例(次の入力データ)
clientID | name | address | phone |
---|---|---|---|
1 | Alice | Tokyo, Japan | 090-1234 |
-
基本情報(clientID, name, address)
-
連絡先情報(clientID, name, phone)
🛠 やり方(tMap)
-
tMap
コンポーネントを追加し、tFixedFlowInput
と接続 -
出力を2つ作る(例):
出力名 | 欲しい列 |
---|---|
basic | clientID , name , address |
phone | clientID , name , phone |
tMap
のエディタを開いて、それぞれの出力に必要な列だけ残す-
「Auto Map(自動マッピング)」を使えば、同じ列名は自動で接続される
-
結果をそれぞれ
tLogRow
で出力:
🖥 出力結果
-
元の入力データ:
clientID | name | address | phone |
---|---|---|---|
1 | Alice | Tokyo | 090-1234 |
clientID | name | address |
---|---|---|
1 | Alice | Tokyo |
clientID | name | phone |
---|---|---|
1 | Alice | 090-1234 |
🧠 最後に:tSplitRow と tMap の違い
目的 | コンポーネント | 説明 |
---|---|---|
1つの行 → 複数の行へ | tSplitRow | 1行に複数レコードが入っている場合に使用 |
同じ行 → 項目ごとに複数出力へ | tMap | 欲しい情報だけ取り出して分岐させる |
✅ まとめ:Talendでのデータ分割
方法 | コンポーネント | 使いどころ |
---|---|---|
行レベル分割 | tSplitRow | 1行に複数レコードがある場合(例:client1とclient2) |
データ内容で分割 | tMap | 同じ行を、役割別や用途別に分けたい場合 |
🎯 正規化・非正規化
Talendで次の2つを行う方法を学びます。
-
正規化(Normalize):1行の中にカンマで区切られた複数の値を複数行に分ける
-
非正規化(De-normalize):複数行に分かれているデータを1行にまとめる
✅ 使用するTalendコンポーネント
処理内容 | 使用コンポーネント | 補足 |
---|---|---|
正規化(Normalize) | tNormalize | カンマなどの区切り文字で行を分割 |
非正規化(De-normalize) | tDenormalize or tDenormalizeSortedRow | データを1行に結合(※ソートされているならSortedRow 推奨) |
🔧 処理の流れ
📝 実行例:元ファイル labels.txt
例:
↓
🌱 正規化(tNormalize後)
1行をカンマ区切りでバラバラにして、1項目ずつの行に変換します。
↓
🧹 整理(Advanced設定)で:
-
重複削除:✔ get rid of duplicates
-
空行削除:✔ discard empty strings
-
前後の空白削除:✔ trim resulting values
結果:
↓
🧠 非正規化(tDenormalizeSortedRow後)
最終的なきれいな1行の出力:
💡 補足説明
用語 | 説明 |
---|---|
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 | 固定値(国コードと国名の対応表)を入力する |
tJoin | 2つのデータを「共通キー」で結合する |
tLogRow | データをコンソールに表示する(確認用) |
🗂️ シナリオ:
-
顧客データ(Clients)に国コード(例:
US
)がある -
国コード一覧(Countries)にコードと国名(例:
US → United States
)がある -
この2つを国コードで結合して、国名を追加する!
🔧 処理の手順まとめ(簡易図解)
🧪 データ例:
顧客データ(tRowGeneratorで生成)
名前 | 国コード |
---|---|
Alice | US |
Bob | DE |
Charlie | FR |
David | UNKNOWN |
Eva | N/A |
国コード | 国名 |
---|---|
US | United States |
DE | Germany |
FR | France |
🔁 結合設定(tJoin)
-
接続順序が大事!
-
最初にtRowGenerator(Main)→ tJoin
-
次にtFixedFlowInput(Lookup)→ tJoin
-
-
スキーマ設定
-
顧客側の全列を「←←」ボタンで全コピー
-
国名(countryName)を「→」ボタンで追加
-
-
結合キーの設定
-
顧客データの「country」列と
国名一覧の「countryCode」列をマッチさせる
-
-
出力の設定
-
「Include lookup columns in output」にチェック
-
「countryName」に対応する国名を表示させる
-
-
出力の分岐
-
正常にマッチしたデータ →
Main
出力(JOINED) -
マッチしなかったデータ →
Reject
出力(REJECT)
-
✅ 実行結果の例:
JOINED 出力(成功した結合)
名前 | 国コード | 国名 |
---|---|---|
Alice | US | United States |
Bob | DE | Germany |
Charlie | FR | France |
REJECT 出力(マッチしなかったデータ)
名前 | 国コード | 国名 |
---|---|---|
David | UNKNOWN | null |
Eva | N/A | null |
⚠️ tJoin の注意点(制限)
-
柔軟な処理ができない
-
例えば「UNKNOWN」は「不明」と表示したい、などの条件分岐ができない
→ そういう場合はtMap
を使う
-
-
複数の表(3表以上)を結合できない
-
tJoin
は 2つのデータだけを結合可能
→ 多段結合が必要な場合もtMap
を使う
-
💡補足:tJoin と tMap の使い分け
特徴 | tJoin | tMap |
---|---|---|
対応件数 | 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を解凍する
中に sakila-schema.sql
と sakila-data.sql
があるのを確認。
✅ 3. MySQLに接続する
ターミナルまたはコマンドプロンプトからMySQLに接続します:
パスワードを聞かれるので入力。
✅ 4. Sakilaを読み込む(2ステップ)
これで「sakila」データベースが作成されます!
確認:
✅ 5. TalendでSakilaに接続
Talend内でも使えるように設定します。
ステップ:
-
「DB接続」設定をコピー
既存の接続を右クリック → Duplicate(複製)
名前を「sakila2」などにしておく -
中のスキーマ(テーブル情報)を削除
元の複製でついてきたテーブルは削除する -
接続設定を編集
-
「Database名」を
sakila
に変更 -
「Test Connection」で接続確認 → 成功したら「Finish」
-
-
スキーマの取り込み(Retrieve Schema)
-
actor
,film
,film_actor
を選択 -
Next → Next → Finish で完了
-
✅ 最後に
これで「Sakilaデータベース」がMySQLとTalendの両方で使えるようになります。
この後、actor
・film
・film_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_id
とfilm_actor.film_id
を結合(ドラッグでも指定でもOK) -
次に
film_actor.actor_id
とactor.actor_id
を結合(こちらは手入力)
🔧 JOIN設定の注意点(tMap左上の赤いドットのアイコン):
テーブル | JOINの種類 | 結果の種類 |
---|---|---|
film_actor | Inner Join(全件) | すべての一致を出力する |
actor | Inner 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
に分類される(例:ドキュメンタリー)
🧠 ポイントのまとめ
項目 | 内容 |
---|---|
なぜtMap ? | tJoin は2つまでしか結合できない。tMap は3つ以上のJOINや柔軟な条件設定が可能。 |
JOINの種類の違い | Unique match =1対1、All matches =1対多を扱う |
Rejectを取る理由 | 結合できなかったデータも検証・記録しておくため |
CSV出力の工夫 | ヘッダーを含める・出力ファイルが既にあればエラーを出さないよう設定 |
✍ こんなときに使える!
-
複数テーブルのマスターデータを集約
-
JOIN失敗のログを出力して分析
-
tMapで条件付き変換も一緒にしたいとき
🎯 tMapデータフィルター
JOINされたデータにフィルターをかけて、2つのグループに分けること!
-
フィルター条件を満たすデータ → 正常データ
-
フィルター条件に落ちたデータ → フィルターリジェクト(除外データ)
🧱 前回の復習(ベースのジョブ構成)
前の動画で作ったジョブ(mappingJoin
)では、
-
3つのテーブル:
film
,actor
,film_actor
-
tMap
でJOIN → 正常なデータ(joined
)と、JOINできなかったデータ(join_reject
)に分けた
🔄 今回やること
-
そのジョブを 複製して名前を
mappingFilter
に変更 -
正常なJOINデータ(
film_actor_joined
)に対して フィルターをかける -
条件に合格したデータ →
film_actor_joined_filtered
-
条件に落ちたデータ →
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 Settings
→Catch output reject
を true にする
☝ 補足:
「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する。
🤔 なぜ変換を分けるの?
-
JOIN用のtMapがごちゃごちゃになるのを防ぐため
-
actor
テーブルは たった200件しかない
→ それをJOINごとに毎回変換するのは 非効率!
🪜 手順をやさしくステップで解説
✅ 1. 既存ジョブを複製する
-
mappingFilter
などの前のジョブをコピー -
新しいジョブ名:
mappingTransform
✅ 2. tMapコンポーネントを追加
-
actor
テーブルの出力とJOINの間に、新しいtMap
を追加
✅ 3. 変換用tMapの設定
-
入力列:
actor_id
,first_name
,last_name
,last_update
-
出力列:同じカラム構成(
Auto Map
ボタンで自動連携) -
first_name
,last_name
を変換する
変換方法(例:first_name)
✅ 最初の1文字はそのまま(大文字)
✅ 2文字目以降をtoLowerCase()
で小文字化
last_name も同じ方法で変換
✅ 4. テストして確認する
-
tMap
の中で「Test」ボタンを使って変換が正しくできるか確認できる
✅ 5. 実行して結果を確認
-
実行すると…
-
actor
テーブルが最初に読み込まれ、変換される -
JOIN処理でその変換後の名前が使われる
-
-
出力ファイルでは、きちんと名前が整形された状態で出てくる
🎉 結果例
元の名前 | 変換後 |
---|---|
GARY PHOENIX | Gary Phoenix |
MARY SMITH | Mary Smith |
TOMMY LEE JONES | Tommy Lee Jones |
🧠 まとめ
内容 | 説明 |
---|---|
なにをする? | すべて大文字の名前を「最初だけ大文字、他は小文字」に変換する |
どこで変換? | JOIN前に、actor テーブルだけ別の tMap で変換 |
なぜ別にしたの? | 毎回変換すると効率が悪いし、JOINの tMap がごちゃごちゃになるため |
方法は? | substring() と toLowerCase() を組み合わせて変換 |
テストできる? | tMap の中の「Test」機能で事前に変換結果を確認できる |
🎯 「fieldExtract」ジョブの導入と準備
この動画では、本題に入る前の準備として、
以下のような処理の「枠組み(テンプレート)」を作ります:
🗂 やることまとめ(ざっくり)
処理の流れ | 内容 |
---|---|
1️⃣ tPreJob | 処理の最初に一度だけ実行する準備処理(データ作成) |
2️⃣ Main処理 | ダミーデータを作り、4種類のファイル形式で出力 |
3️⃣ tPostJob | 処理の最後に、作成したファイルを削除する後処理 |
🛠 使用する主なコンポーネント
コンポーネント名 | 役割 |
---|---|
tPreJob / tPostJob | ジョブの前後に一度だけ実行される処理 |
tRowGenerator | テスト用のダミーデータを生成する |
tReplicate | データを複数の出力に分岐する |
tFileOutputJSON | JSONファイルに出力 |
tFileOutputXML | XMLファイルに出力 |
tFileOutputPositional | 固定長(位置決め)ファイルに出力 |
tFileOutputDelimited | CSVなどの区切り付きファイルに出力 |
tFileList | ファイル一覧を取得する |
tFileDelete | ファイルを削除する |
tSleep (一時的に使用) | 一瞬だけ処理を待つ(1秒)← 作成→削除の確認用 |
🧪 実装ステップ(やさしく解説)
✅ ステップ1:前処理(tPreJob)
📌 目的:ダミーデータを1件作る
-
データ内容は:
-
name
(例:自分の名前) -
email
(例:自分のメール) -
birthday
(日付)
-
💡 データ生成方法(tRowGenerator)
-
birthday
はDate
型にして、TalendDate.parseDate("yyyy-MM-dd", "1980-01-01")
のように入力 -
「Preview」ボタンでちゃんとデータが出るか確認できる
-
件数は「1件」に変更する(デフォルトだと100件になってる)
✅ ステップ2:ファイル形式で出力(tReplicateと各種tFileOutput)
出力形式 | ファイル名例 | 特記事項 |
---|---|---|
JSON | data.json | - |
XML | data.xml | - |
固定長 | data.txt | 各列の長さを指定(例:50, 50, 10) |
CSV | data.csv | - |
-
context.outputDir
というコンテキスト変数を使って保存先を指定-
例:
context.outputDir + "data.json"
のように書く
-
✅ ステップ3:後処理(tPostJob)
📌 目的:生成した4つのファイルを最後に削除する
-
tFileList
で出力先フォルダをスキャン -
tFileDelete
で.json
などのファイルを削除
⚠️ 注意点!
-
filemask(ファイル名マスク)を忘れると危険!
-
指定しないと フォルダ内すべてのファイルが削除されてしまう!
-
例:
*.json
,*.csv
などを filemask に設定するのが正解 -
講師も一度間違えて全部削除してしまった様子(人間らしい…)
-
✅ ステップ4:tSleep(削除前に一瞬待つ)
-
実行結果を目で確認するため、1秒だけ待つ
tSleep
をtPreJob
とtPostJob
の間に一時追加 -
後で削除OK(確認用の仮処理)
🧾 実行結果のイメージ
🧠 補足:コンテキスト変数の使い方
-
変数を書くときは
context.
と打つ -
途中で [Ctrl] + [Space] を押すと候補一覧が出てくる!
-
たとえば:
🎉 次回予告
このジョブの「テンプレート」が完成したので、
次からは「個別の抽出処理(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+C
とCtrl+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の構造を作成。
-
出力はコンソールに表示します。
📝 実際の手順
-
データ準備
-
tFixedFlowInput
コンポーネントに3つのカラムを用意します。 -
tLogRow
コンポーネントをつなげて、生成されるデータをコンソールで確認できるようにします。 -
表示モードは「Table」に切り替えます。
-
-
データの複製(リプリケート)
-
tReplicate
コンポーネントを使い、データを2つに分けます。 -
片方を
tWriteJSONField
に、もう片方をtWriteXMLField
に渡します。
-
-
JSONの設定(tWriteJSONField)
-
スキーマ編集で、出力は1つの文字列(String)として受け取ります。名前は
jsonString
など。 -
JSONツリー設定を開き、ルートタグ(rootTag)にサブ要素として
person
を追加。 -
person
はループ要素に設定します(複数のpersonが繰り返す想定)。 -
3つのカラムを
person
の子要素として割り当てます。
-
-
XMLの設定(tWriteXMLField)
-
スキーマは1列で型は「Document」(XMLのドキュメント型)。名前は
xmlField
など。 -
XMLツリー設定で、JSONのときと同じく
person
をサブ要素に追加し、ループ要素に設定。 -
3つのカラムを
person
の子要素として配置します。
-
-
コンソール表示
-
JSON出力用とXML出力用にそれぞれ
tLogRow
をつなぎ、モードは「Table」に設定。 -
ラベルも分かりやすく「JSON」「XML」に変更。
-
-
ジョブの実行
-
ジョブを実行すると、コンソールにJSON形式の文字列とXML形式の文字列が表示されます。
-
📝 まとめ
-
TalendのtWriteJSONFieldとtWriteXMLFieldは、複数のカラムを元に、それぞれの形式の文字列を簡単に作れるコンポーネントです。
-
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つある:
-
Javaコードを使う方法
-
System.out.println()
で文字列と一緒に、globalMap
からcountryCode
とcountryName
を取り出してコンソール表示。
-
-
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ファイルとして保存される。