キー列を指定する結合
2 つのデータを、キー列の値が同じ行どうしでつなぎます。顧客マスタと購入履歴を顧客 ID でつなぐ、商品コードで単価表を引く、といった使い方をします。Excel の VLOOKUP にあたります。
同じカテゴリに結合が 3 つあります。値を突き合わせるのがこのページ、行の並び順でそのまま横に並べるのが単純な横結合、行を縦に積み増すのが単純な縦結合です。
入出力
| ポート | 内容 |
|---|---|
| 左入力データ | データ |
| 右入力データ | データ |
| 出力データ | つないだデータ |
Spark エンジンでも動きます。
設定項目
フォームの見出しの並び — 「対象列を設定」 → 「比較条件を設定」。条件によって出ない見出しもあります。
- キー列を選択
- 左右でキー列の名前が同じかを選びます。
左右のキー列名が同じと左右のキー列名が異なるの 2 つで、既定は左右のキー列名が同じです。 - 列を選択必須
左右のキー列名が同じのときに出ます。キーにする列を選びます。複数選べます。左右どちらにもある列だけがキーとして使われます。- 結合列設定必須
左右のキー列名が異なるのときに出ます。左ノードのキー列選択と右ノードのキー列選択の組を作ります。組は複数作れますが、左右の数は必ず同じになります。- 結合タイプを選択
- どちらのデータの行を残すか。6 種類あります(次の節)。既定は
共通部分を残す(inner join)です。 - 多対多の結合を有効にする
- オプションの中にあります。既定は off。左右両方にキーの重複があるとき、off のままだと行数が増えすぎる恐れがあるとして処理を止めます。「条件を指定する」を on にしているあいだは、この項目自体が出ません(anti join のときは出ます)。
- 条件を指定する
- オプションの中にあります。既定は off。キーの一致に加えて、大小比較の条件でも絞ります(期間内かどうかなど)。結合タイプが
共通部分を残す(inner join)/左側のデータを残す(left join)/右側のデータを残す(right join)/左右両方のデータを残す(outer join)のときだけ出ます。
結合タイプ
左に A, B, C、右に B, C, D というキーがある場合に、残る行は次のとおりです。
| 結合タイプ | 残る行 | 使いどころ |
|---|---|---|
| 共通部分を残す(inner join) | B, C | 両方にあるものだけが欲しい |
| 左側のデータを残す(left join) | A, B, C | 左を主にして、右の情報を足す |
| 右側のデータを残す(right join) | B, C, D | 右を主にして、左の情報を足す |
| 左右両方のデータを残す(outer join) | A, B, C, D | どちらも落としたくない |
| 右に存在しない左のデータを残す(left anti join) | A | 右にないものを探す(未購入の顧客など) |
| 左に存在しない右のデータを残す(right anti join) | D | 左にないものを探す |
相手にない側の列は空欄になります。 これは anti join でも同じで、相手の列は付いたうえで、中身がすべて空欄になります。列ごと消えるわけではないので、要らなければ結合後に列選択/削除で外してください。
6 種類を同じデータで並べたところ
左のデータ(顧客ID と 年齢)と右のデータ(顧客ID と 性別)を 顧客ID でつなぎます。左は 1 / 2 / 5、右は 1 / 2 / 4 を持っています。
| 結合タイプ | 出力に残る顧客ID | 空欄になるところ |
|---|---|---|
| 共通部分を残す(inner join) | 1, 2 | なし |
| 左側のデータを残す(left join) | 1, 2, 5 | 5 の性別 |
| 右側のデータを残す(right join) | 1, 2, 4 | 4 の年齢 |
| 左右両方のデータを残す(outer join) | 1, 2, 4, 5 | 5 の性別、4 の年齢 |
| 右に存在しない左のデータを残す(left anti join) | 5 | 性別(列は残り、全部空欄) |
| 左に存在しない右のデータを残す(right anti join) | 4 | 年齢(列は残り、全部空欄) |
キー列の決まり
- 左右どちらにもある列だけがキーになります。
左右のキー列名が同じで「すべての列」を選んでも、片方にしかない列はキーから外れます 左右のキー列名が同じでは、キー列は出力に 1 列だけ残ります。左右のキー列名が異なるでは、左右のキー列が両方残ります左右のキー列名が異なるでは、左右の組の数が揃っていることが必要です。同じ列を 2 回指定することもできません- キー列の型が左右で違うとエラーになります。数値と文字列を突き合わせることはできません。型は「文字列 / 数値 / 日付 / 日付時間 / 時間」の 5 つで見るので、整数と小数はどちらも数値として扱われ、つなげます
行の並び方
| 結合タイプ | 出力の行の順番 |
|---|---|
| 共通部分を残す(inner join) | 左の行順 |
| 左側のデータを残す(left join) | 左の行順 |
| 右側のデータを残す(right join) | 右の行順 |
| 左右両方のデータを残す(outer join) | キーの昇順に並び替わります |
| 右に存在しない左のデータを残す(left anti join) | 左の行順 |
| 左に存在しない右のデータを残す(right anti join) | 右の行順 |
並び順が決まっていてほしいときは、結合のあとに行の並べ替えを置いてください。
同じ名前の列があるとき
キー以外に同じ名前の列があると、末尾に _x / _y が付きます。左から来た列が _x、右から来た列が _y です。
| 列の役割 | 左入力 | 右入力 | 出力 |
|---|---|---|---|
| キー | 顧客ID | 顧客ID | 顧客ID |
| 同名の列 | 登録日 | 登録日 | 登録日_x と 登録日_y |
_x / _y を付けてもまだ名前がぶつかる場合は、さらに末尾に _1 から順の番号が付きます。
行数が増えることがある
キーが重複していると、組み合わせの数だけ行が増えます。 左に同じ顧客 ID が 2 行、右に 3 行あると、その顧客だけで 6 行になります。
| 左の重複 | 右の重複 | 結果 |
|---|---|---|
| なし | なし | 行数は増えない |
| あり | なし | 左の行数のまま |
| なし | あり | 右の重複の分だけ増える |
| あり | あり | 止まる(「多対多の結合を有効にする」が必要) |
両方に重複があるときだけ、処理を止めて確認を求めます。意図した結合なら「多対多の結合を有効にする」を on にしてください。意図していないなら、先に重複行の処理の処理タイプ「重複行を削除」でどちらかを 1 行にまとめます。
条件を指定する
キーの一致だけでなく、大小比較も条件に加えられます。「商品コードが一致し、かつ購入日が適用期間内」のような結合に使います。
条件は左右の両方の列を使います。 「対象のノードを選択」で選んだ側から比べられる列を取り、比べる相手の列は反対側から選びます。条件はいくつでも足せます。
条件 1 つぶんの設定項目
- 対象のノードを選択必須
- 比べられる側を
左側か右側から選びます。既定は左側。 - 左側の対象列を選択 / 右側の対象列を選択必須
- 比べられる列。「対象のノードを選択」で選んだ側から出ます。数値・日付・日付時間・時間の列だけ選べます。
- 比較タイプを選択必須
より小さい(<)/以下(<=)/より大きい(>)/以上(>=)/範囲指定のいずれか。- 固定値を条件値にする
範囲指定以外のときに出ます。既定は off。相手の列と比べる代わりに、入力した値と比べます。on にすると 値を入力 の欄に変わります。- 左側の列を選択 / 右側の列を選択必須
- 比べる相手の列。対象列とは反対側から選びます。「固定値を条件値にする」が off のときに出ます。
- 不等号選択必須
範囲指定のときに出ます。端を含むかどうかを次の 4 通りから選びます。始点値 < 対象値 < 終点値/始点値 ≦ 対象値 < 終点値/始点値 < 対象値 ≦ 終点値/始点値 ≦ 対象値 ≦ 終点値(既定)- 固定値を始点にする / 固定値を終点にする
範囲指定のときに出ます。どちらも既定は off。off のあいだは、始点・終点を反対側のノードの列(「左側の始点列を選択」「右側の終点列を選択」など)から選びます。on にすると 値を入力 の欄に変わります。
エラーと対処
どのエラーも、左右それぞれのデータを 1 つ前のノードで開いて、列名と型を見比べるところから始めてください。
キー列の型が左右で違う
突き合わせるキー列の型が食い違っているとき。「条件を指定する」で選んだ列の型が食い違っているときも同じです。
{{mismatch_keys}}列のデータ型が左右で異なります。どちらかに揃えてください。
直し方 — 列の型変更で型を揃えます。ID 列は、片方が数値・片方が文字列になっていることがよくあります。先頭の 0 が意味を持つ ID(00123)は、文字列に揃えてください。数値にすると 0 が消えます。
片方のデータが 0 行のときにも出ることがあります。 行が 1 つもないと、文字列の列と日付の列を見分けられないためです。前のノードで行が残っているか確かめてください。
共通のキー列がない
左右のキー列名が同じ で選んだ列が、右側に 1 つもないとき。
共通キー列が存在しません。
直し方 — 左右の列名を見比べてください。名前が違うなら 左右のキー列名が異なる に切り替えて組を作ります。
キー列の数が左右で違う
左右のキー列名が異なる で、左右の組が揃っていないとき。
キー列の数が左右で異なります。複数キーを指定する場合は左右で数を揃えてください。
直し方 — 組の片方だけが空になっていないか確かめてください。
同じ列を 2 回キーにしている
左右のキー列名が異なる で、片側のキー列に同じ列を重ねて指定したとき。
{{left_or_right}}キー列が重複しています。片方を除外するか、列名を変更してください。対象列:{{target_cols}}
直し方 — 重複している組を外します。
両方のキーに重複があり止まった
左右のどちらにもキーの重複があるとき。そのまま結合すると行数が急激に増えるため、実行前に止めます。
両方のデータで選択したキーに重複があり、組み合わせ爆発の懸念があるため処理を中止しました。処理を行う場合は、オプションの「多対多の結合を有効化する」チェックボックスを有効にして下さい。
メッセージの「多対多の結合を有効化する」は、画面の項目名「多対多の結合を有効にする」と 1 文字違いますが同じものです。
直し方 — まず重複が意図したものかを確かめてください。意図したものなら「多対多の結合を有効にする」を on にします。そうでなければ、重複行の処理の処理タイプ「重複行を削除」でどちらかを 1 行にまとめるか、キー列を足して一意になるようにします。
結合する列を選んでいない
キー列や条件の列を選ばずに実行したとき。
対象の列が選択されていません。
直し方 — 「列を選択」または「結合列設定」を埋めてください。「条件を指定する」を使っているなら、条件の中の列も埋めます。
選んだ列が見つからない
選んだ列が入力データにないとき。前のノードで列名を変えたり、列を削ったりすると起きます。
対象の列が存在しません。
直し方 — 列を選び直してください。
条件のキー列が設定されていない
「条件を指定する」を使うとき、キーの指定がないまま実行したとき。
条件が等しいキー列の設定が行われていません。
直し方 — 「列を選択」(または「結合列設定」)を埋めてください。条件だけでは結合できません。
列名が重複している
時間型のキー列を扱う途中で、左右の列名がぶつかったとき。
左右のデータで列名:
{{colname}}が重複しています。片方の列名を変更してください
直し方 — 列名の変更で、結合前にどちらかの名前を変えてください。
左 / 右のデータがつながっていない
左側のデータが入力されていません。
右側のデータが入力されていません。
直し方 — 入力が 2 つあります。片方だけつないだ状態になっていないか確かめてください。
よく使う例
1. 購入履歴に顧客情報を足す
お題 — 購入履歴に、顧客マスタの氏名を足す。履歴は全部残したい
入力(左・購入履歴)
| 顧客ID | 金額 |
|---|---|
| C001 | 1200 |
| C002 | 3400 |
| C009 | 500 |
入力(右・顧客マスタ)
| 顧客ID | 氏名 |
|---|---|
| C001 | 田中 |
| C002 | 鈴木 |
設定 — キー列を選択 左右のキー列名が同じ、列を選択 顧客ID、結合タイプを選択 左側のデータを残す(left join)
出力
| 顧客ID | 金額 | 氏名 |
|---|---|---|
| C001 | 1200 | 田中 |
| C002 | 3400 | 鈴木 |
| C009 | 500 |
2. 両方にあるものだけを残す
お題 — 今月と先月の両方で購入があった顧客だけを見たい
入力(左・今月)
| 顧客ID | 金額 |
|---|---|
| C001 | 1200 |
| C002 | 3400 |
入力(右・先月)
| 顧客ID | 金額 |
|---|---|
| C002 | 800 |
| C005 | 900 |
設定 — 列を選択 顧客ID、結合タイプを選択 共通部分を残す(inner join)
出力
| 顧客ID | 金額_x | 金額_y |
|---|---|---|
| C002 | 3400 | 800 |
同じ名前の 金額 が左右にあるので、金額_x(今月)と 金額_y(先月)に分かれます。
3. まだ買っていない顧客を探す
お題 — 顧客マスタのうち、購入履歴に出てこない顧客を知りたい
入力(左・顧客マスタ)
| 顧客ID | 氏名 |
|---|---|
| C001 | 田中 |
| C002 | 鈴木 |
| C005 | 佐藤 |
入力(右・購入履歴)
| 顧客ID | 金額 |
|---|---|
| C001 | 1200 |
設定 — 列を選択 顧客ID、結合タイプを選択 右に存在しない左のデータを残す(left anti join)
出力
| 顧客ID | 氏名 | 金額 |
|---|---|---|
| C002 | 鈴木 | |
| C005 | 佐藤 |
購入履歴側の 金額 列も付いてきて、中身は全部空欄です。要らなければ列選択/削除で外します。
4. 列名が違うキーでつなぐ
お題 — 左は 顧客ID、右は 会員番号 という名前だが、中身は同じ
入力(左)
| 顧客ID | 金額 |
|---|---|
| C001 | 1200 |
入力(右)
| 会員番号 | 氏名 |
|---|---|
| C001 | 田中 |
設定 — キー列を選択 左右のキー列名が異なる、結合列設定で 左ノードのキー列選択 顧客ID / 右ノードのキー列選択 会員番号 の組を 1 つ作る
出力
| 顧客ID | 金額 | 会員番号 | 氏名 |
|---|---|---|---|
| C001 | 1200 | C001 | 田中 |
キー列が両方残ります。 片方要らないなら列選択/削除で外してください。
5. 2 つの列でつなぐ
お題 — 店舗と日付の両方が一致する行をつなぎたい
入力(左・売上)
| 店舗 | 日付 | 売上 |
|---|---|---|
| 渋谷 | 2024-01-05 | 120000 |
| 新宿 | 2024-01-05 | 98000 |
入力(右・来客数)
| 店舗 | 日付 | 来客数 |
|---|---|---|
| 渋谷 | 2024-01-05 | 310 |
| 渋谷 | 2024-01-06 | 290 |
設定 — 列を選択で 店舗 と 日付 の 2 つを選ぶ、結合タイプを選択 共通部分を残す(inner join)
出力
| 店舗 | 日付 | 売上 | 来客数 |
|---|---|---|---|
| 渋谷 | 2024-01-05 | 120000 | 310 |
片方だけ一致しても結合されません。
6. 期間に当てはまる単価を引く
お題 — 購入履歴に、商品ごとの価格表から購入日に有効だった単価を付けたい
入力(左・購入履歴)
| 商品コード | 購入日 |
|---|---|
| P1 | 2024-03-10 |
入力(右・価格表)
| 商品コード | 適用開始日 | 適用終了日 | 単価 |
|---|---|---|---|
| P1 | 2024-01-01 | 2024-02-29 | 100 |
| P1 | 2024-03-01 | 2024-12-31 | 120 |
設定
- キー列を選択
左右のキー列名が同じ、列を選択商品コード - 結合タイプを選択
左側のデータを残す(left join) - オプションの「条件を指定する」を on
- 対象のノードを選択
左側、左側の対象列を選択購入日、比較タイプを選択範囲指定 - 不等号選択
始点値 ≦ 対象値 ≦ 終点値、右側の始点列を選択適用開始日、右側の終点列を選択適用終了日
出力
| 商品コード | 購入日 | 適用開始日 | 適用終了日 | 単価 |
|---|---|---|---|---|
| P1 | 2024-03-10 | 2024-03-01 | 2024-12-31 | 120 |
商品コードが一致し、かつ購入日が適用期間に入っている行だけがつながります。
7. 1 人の顧客に複数の注文をつなぐ
お題 — 顧客ごとに 1 行のマスタに、顧客ごとに何件もある注文をつなぐ。行が増えるのは承知のうえ
入力(左・顧客マスタ)
| 顧客ID | 氏名 |
|---|---|
| C001 | 田中 |
入力(右・注文)
| 顧客ID | 注文ID |
|---|---|
| C001 | O-1 |
| C001 | O-2 |
設定 — 列を選択 顧客ID、結合タイプを選択 左側のデータを残す(left join)
出力
| 顧客ID | 氏名 | 注文ID |
|---|---|---|
| C001 | 田中 | O-1 |
| C001 | 田中 | O-2 |
左は 1 行でしたが、右に 2 行あるので出力は 2 行になります。重複があるのは右だけなので、「多対多の結合を有効にする」は要りません。思ったより行が増えたときは、結合する前にそれぞれのデータで重複行の処理の処理タイプ「重複した行を抽出」を使い、キー列の重複を見てください。