注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Contour には、結合を実行するためのさまざまなボードがあります。このガイドでは、(1)各ボードを使ってデータセットを結合する方法、(2)各ボードに相当する SQL、(3)パフォーマンスに関する考慮事項を説明します。
結合ボードでは、現在作業中のデータセットを別のデータセットと結合し、一致する結果をデータにマージできます。概要は次のとおりです。

顧客の購入に関する情報を含むテーブルがあるとします。
| customer_id | item_id | purchase_date | price |
|---|---|---|---|
| 101 | 999 | 1/1/2000 | 50 |
| 121 | 997 | 1/1/2000 | 35 |
| … |
在庫にあるすべての商品に関する情報を含む、別のテーブルもあるとします。
| item_id | item | weight_kg |
|---|---|---|
| 999 | オーブントースター | 1 |
| 997 | フライパン | 0.5 |
| … |
結合ボードを使うと、購入された各商品に関する情報を元のデータセット(transactions)に追加して拡充できます。
データセットに同じ名前の列がある場合、Contour は列名に接頭辞を追加するための入力画面を表示します。この例では、両方のデータセットに item_id という列があります。結合するデータセットの列に、接頭辞「inv」(inventory の略)を付けます。
結合後のデータセットに重複する item_id 列を追加したくない場合は、結合するデータセットでその列の選択を外すことができます。

拡充されたデータセットは次のようになります。
| customer_id | item_id | purchase_date | price | inv_item | inv_weight_kg |
|---|---|---|---|---|---|
| 121 | 997 | 1/1/2000 | 35 | フライパン | 0.5 |
| 101 | 999 | 1/1/2000 | 50 | オーブントースター | 1 |
| … |
実行する結合の種類を選択します。左結合(Add columns)、内部結合(Intersection)、右結合(Switch to dataset)、完全結合(Incorporate all data, matching rows where possible)から選択できます。
もう一方のデータセットから、現在作業中のデータセットに追加する列を選択します。デフォルトでは、最初のデータセットのすべての列が返されます。
次に、それぞれのデータセットから1個以上のキーを選択します。複数の結合キーを使う場合は、1つ以上の条件またはすべての条件に一致するように選択できます。
完全結合では、2つのデータセットのすべての行が返されます。2つの結合列の値は1つにまとめられないため、どちらのデータセットの結合列にも null 値が表示される可能性があります。
和集合ボードを使うと、別のデータセットに基づいて現在のデータセットを変更できます。別のデータセットからデータを追加する(行の追加)、もう一方のデータセットに存在するデータのみを保持するようにデータセットを絞り込む(行の保持)、または別のデータセットに存在するデータに基づいてデータを削除する(行の削除)ことができます。データセット内の列の位置、または列名に基づいて照合するように選択できます。
次の3個のテーブルは、具体的な架空の例です。
people
| first_name | last_name |
|---|---|
| Casey | Linden |
| Jess | Sage |
| Lee | Rose |
| Taylor | Oak |
candidates
| first_name | surname |
|---|---|
| Jess | Sage |
| Lee | Rose |
| Jamie | Wood |
candidates_backward
| last_name | first_name |
|---|---|
| Sage | Jess |
| Rose | Lee |
| Wood | Jamie |
人物のテーブルがあり、これを2個の候補者のテーブルと比較したいとします。どちらのテーブルも、people テーブルとはスキーマが異なります。以下のセクションでは、テーブルに対して実行する比較(集合演算)に応じた結果の集合を示します。
people テーブルを起点として、candidates_backward テーブルから名前で照合して行の追加を行うと、結果の集合は次のようになります。
| first_name | last_name |
|---|---|
| Casey | Linden |
| Jess | Sage |
| Lee | Rose |
| Taylor | Oak |
| Jess | Sage |
| Lee | Rose |
| Jamie | Wood |
people テーブルを起点として、candidates_backward テーブルから位置で照合して行の追加を行うと、結果の集合では、people テーブルの名前に candidates_backward テーブルの姓が追加され、姓には名前が追加されます。これはおそらく意図した結果ではありません。結果の集合は次のようになります。
| first_name | last_name |
|---|---|
| Casey | Linden |
| Jess | Sage |
| Lee | Rose |
| Taylor | Oak |
| Sage | Jess |
| Rose | Lee |
| Wood | Jamie |
candidates テーブルから people テーブルに行の追加を行う場合は、位置で照合するのが適切です。列名は一致しませんが、名前と姓の列の位置は一致するためです。列名は元の集合から引き継がれることに注目してください。
| first_name | last_name |
|---|---|
| Casey | Linden |
| Jess | Sage |
| Lee | Rose |
| Taylor | Oak |
| Jess | Sage |
| Lee | Rose |
| Jamie | Wood |
people テーブルを起点として、candidates テーブルを位置で照合し、そこに存在する行を対象に行の保持を行うよう和集合ボードを設定すると、結果の集合は次のようになります。
| first_name | last_name |
|---|---|
| Jess | Sage |
| Lee | Rose |
people テーブルを起点として、candidates_backward テーブルを名前で照合し、そこに存在する行を対象に行の保持を行うよう和集合ボードを設定すると、結果の集合は次のようになります。
| first_name | last_name |
|---|---|
| Jess | Sage |
| Lee | Rose |
people テーブルを起点として、candidates テーブルを位置で照合し、そこに存在する行を対象に行の削除を行うと、結果の集合は次のようになります。
| first_name | last_name |
|---|---|
| Casey | Linden |
| Taylor | Oak |
people テーブルを起点として、candidates_backward テーブルを名前で照合し、そこに存在する行を対象に行の削除を行うと、結果の集合は次のようになります。
| first_name | last_name |
|---|---|
| Casey | Linden |
| Taylor | Oak |
代わりに、people テーブルを起点として、candidates_backward テーブルを位置で照合し、そこに存在する行を対象に行の削除を行うと、結果の集合は次のようになります。位置で照合した場合、candidates_backward テーブルに存在する行はなかったため、このテーブルは people テーブルと同一です。
| first_name | last_name |
|---|---|
| Casey | Linden |
| Jess | Sage |
| Lee | Rose |
| Taylor | Oak |
行の保持、行の追加、または行の削除を選択し、比較する集合を選択します。
行の保持と行の削除では、存在するまたは一致する列を選択できます。
和集合を作成する場合、両方のデータセットの列数が同じでなければなりません。そのため、和集合ボードを使う際にスキーマが変更される可能性がある場合は、注意が必要です。たとえば、ピボット済みデータに切り替えられたピボットテーブルの下流にある和集合ボードでは、スキーマの変更によって列数が予期せず変わる可能性があります。
SQL に詳しいユーザーは、Contour の結合操作を、それに相当する SQL と対応付けて考えると理解しやすくなります。 次のテーブルは、各ボードがサポートする SQL の結合の種類を示しています。
結合操作は、SQL では次の処理に相当します。
Copied!1 2 3 4SELECT [DISTINCT] <Column1, Column2, ...> FROM CurrentTable <INNER JOIN | LEFT OUTER JOIN | RIGHT OUTER JOIN | FULL OUTER JOIN > OtherTable ON <join condition 1>([AND | OR] <join condition 2> [AND | OR] <join condition 3> ...)
**行の保持(一致する列)**は、SQL の左半結合に相当します。
Copied!1 2 3SELECT L.* FROM L INNER JOIN (SELECT DISTINCT <join column> FROM R) AS R_KEY ON L.<join column> = R_KEY.<join column>
**行の削除(一致する列)**は、結合キーが一致しない行を対象とする SQL の左外部結合に相当します。
Copied!1 2 3 4SELECT L.* FROM L LEFT OUTER JOIN R ON L.<join column> = R.<join column> WHERE R.<join column> is null
結果の集合を確認し、データ型が期待されるものになっていることを確かめてください。
和集合ボードを使用するときは、列のデータ型に注意してください。対応する列のデータ型はキャストされます。具体例として、次の2個のデータセットを考えます。
dataset1
| ID (int) | 名前(文字列) |
|---|---|
| 555 | Alice |
| 666 | Bob |
dataset2
| ID (Long) | 名前(文字列) |
|---|---|
| 555 | Alice |
| 999 | Chloe |
dataset1 を起点として、dataset2 から位置に基づいて行を追加すると、結果の集合は次のようになります。
| ID (Long) | 名前(文字列) |
|---|---|
| 555 | Alice |
| 666 | Bob |
| 555 | Alice |
| 999 | Chloe |
dataset1 を起点として、行の保持で次に表示の対象を dataset2 とし、位置に基づいて照合すると、結果の集合は次のようになります。
| ID (Long) | 名前(文字列) |
|---|---|
| 555 | Alice |
元の集合では ID 列が int 型でしたが、結果の集合では Long 型になります。行の保持と次に表示の組み合わせでは、
Spark の Intersect 関数を使用します。
dataset1 を起点として、行の削除で次に表示の対象を dataset2 とし、位置に基づいて照合すると、結果の集合は次のようになります。
| ID (Long) | 名前(文字列) |
|---|---|
| 666 | Bob |
この場合も、元の集合では ID 列が int 型でしたが、結果の集合では Long 型になります。行の削除と次に表示の組み合わせでは、
Spark の Except 関数を使用します。
データセットを結合した後は、結合結果の集合をテーブルで表示して、期待どおりの結果になっているかを確認することをお勧めします。アクションリボンでテーブルを選択してテーブルボードを追加し、新しい結合結果の集合をスクロールして確認します。