注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Contourでは、結合を実行するためのいくつかの異なるボードが提供されています。このガイドでは、(1)データセットを結合するために各ボードをどのように使用するか、(2)各ボードのSQLとの対応関係、(3)パフォーマンスに関する考慮事項について説明します。
Join ボードを使用すると、現在作業中のデータセットを別のデータセットに結合し、一致する結果をユーザーのデータにマージすることができます。以下に概要を示します:
ユーザーが顧客による購入情報を含むテーブルを持っているとします。
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 | Toaster oven | 1 |
997 | Frying pan | 0.5 |
… |
ユーザーは join ボードを使用して、スタートのデータセット(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 | Frying pan | 0.5 |
101 | 999 | 1/1/2000 | 50 | Toaster oven | 1 |
… |
実行する結合タイプを選択します:左結合(Add columns
)、内部結合(Intersection
)、右結合(Switch to dataset
)、または全結合(Incorporate all data, matching rows where possible
)。
他のデータセットから現在作業中のセットに追加する行を選択します。デフォルトでは、最初のデータセットからすべての行が返されます。
次に、各セットから1つ以上のキーを選択します。複数の結合キーを使用する場合は、Match Any または Match All 条件を選択することができます。
全結合の場合、2つのデータセットからすべての行が返されます。これは、2つの行が結合されないため、どちらのデータセットの結合行でも null 値が表示される可能性があることを意味します。
Union ボードを使用して、現在のデータセットを別のセットに基づいて変更します。別のデータセットからデータを追加(Add rows)、データセットをフィルター処理して他のデータセットに存在するデータのみを保持(Keep rows)、または他のデータセットに存在するデータに基づいてデータを削除(Remove rows)することができます。ユーザーは、データセット内の行の位置に基づいてマッチングするか、行名に基づいてマッチングを選択することができます。
以下の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
テーブルから By name で行を追加すると、結果のセットは次のようになります:
first_name | last_name |
---|---|
Casey | Linden |
Jess | Sage |
Lee | Rose |
Taylor | Oak |
Jess | Sage |
Lee | Rose |
Jamie | Wood |
people
テーブルを基にして、candidates_backward
テーブルから By position で行を追加すると、結果のセットは people
テーブルの名前を candidates_backward
テーブルの姓に追加し、その逆を行います。これはおそらく望ましくない結果です。結果のセットは次のようになります:
first_name | last_name |
---|---|
Casey | Linden |
Jess | Sage |
Lee | Rose |
Taylor | Oak |
Sage | Jess |
Rose | Lee |
Wood | Jamie |
ユーザーは、行名が一致しないが、名前と姓の行の位置が一致するため、people
テーブルから candidates
テーブルに By postion で行を追加したいと思うでしょう。開始セットから行名が取られることに注意してください:
first_name | last_name |
---|---|
Casey | Linden |
Jess | Sage |
Lee | Rose |
Taylor | Oak |
Jess | Sage |
Lee | Rose |
Jamie | Wood |
people
テーブルを基にして、Union ボードを設定して candidates
テーブルに By position で表示される行を保持すると、結果のセットは次のようになります:
first_name | last_name |
---|---|
Jess | Sage |
Lee | Rose |
people
テーブルを基にして、Union ボードを設定して candidates_backward
テーブルに By name で表示される行を保持すると、結果のセットは次のようになります:
first_name | last_name |
---|---|
Jess | Sage |
Lee | Rose |
people
テーブルを基にして、candidates
テーブルに By position で表示される行を削除すると、結果のセットは次のようになります:
first_name | last_name |
---|---|
Casey | Linden |
Taylor | Oak |
people
テーブルを基にして、candidates_backward
テーブルに By name で表示される行を削除すると、結果のセットは次のようになります:
first_name | last_name |
---|---|
Casey | Linden |
Taylor | Oak |
代わりに people
テーブルから始めて、candidates_backward
テーブルに By position で表示される行を削除すると、結果のセットは以下のようになります。このテーブルは位置に基づいてマッチングしたときに candidates_backward
テーブルに表示された行がなかったため、people
テーブルと同一です。
first_name | last_name |
---|---|
Casey | Linden |
Jess | Sage |
Lee | Rose |
Taylor | Oak |
Keep rows、Add rows、または Remove rows を選択し、比較したいセットを選択します。
Keep rows と Remove rows の場合、Appear in または Match on を選択することができます。
Unionを実行するときは、両方のデータセットが同じ数の行を持つ必要があります。したがって、Union ボードを使用するときは、スキーマが変更される可能性がある場合は注意が必要です。たとえば、ピボットされたデータに切り替えられたピボットテーブルの下流のUnion ボードは、スキーマの変更により予期せぬ列の数の変更を受ける可能性があります。
SQLに慣れているユーザーにとっては、Contourの結合操作をSQLの同等のものとして考えることが有用かもしれません。 以下の表は、どのボードがどのSQL結合タイプをサポートしているかを示しています:
Join 操作は、SQLにおいて以下のように等価です:
Copied!1 2 3 4 5 6 7 8 9 10 11
-- 以下のSQLクエリは、テーブル間の結合を行います。 -- [DISTINCT]を使用すると、重複した行を排除できます。 SELECT [DISTINCT] <Column1, Column2, ...> FROM CurrentTable -- 結合タイプはINNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOINのいずれかを選択します。 -- 結合条件は複数指定可能で、ANDまたはORで連結します。 <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のLeft Semi Joinと同等です:
Copied!1 2 3 4 5 6
-- Lテーブルから全ての列を選択します SELECT L.* -- LテーブルをRテーブルの特定の列を重複なしで選択した結果(R_KEYとして命名)と内部結合します FROM L INNER JOIN (SELECT DISTINCT <join column> FROM R) AS R_KEY -- 結合条件は、LテーブルとR_KEYの<join column>が等しいというものです ON L.<join column> = R_KEY.<join column>
Remove rows match onは、結合キーが一致しないSQL Left Outer Joinと同等です:
Copied!1 2 3 4 5 6 7 8
-- Lテーブルから全ての行を選択します。 SELECT L.* -- LテーブルからRテーブルへ左外部結合を行います。 FROM L LEFT OUTER JOIN R -- LテーブルとRテーブルの結合条件を指定します。 ON L.<結合列> = R.<結合列> -- Rテーブルの対象列がnullのレコードのみを抽出します。 WHERE R.<結合列> is null
結果として得られるセットを調べて、データ型が期待通りであることを確認してください。
ユニオンボードを使用する際には、行のデータ型に注意してください。互換性のある列の型はキャストされます。具体的な例として、2つのデータセットを使ってみましょう。
dataset1
ID (int) | Name (string) |
---|---|
555 | Alice |
666 | Bob |
dataset2
ID (long) | Name (string) |
---|---|
555 | Alice |
999 | Chloe |
dataset1
を開始点として、dataset2
から位置による 行の追加を行うと、結果として得られるセットは以下のようになります。
ID (long) | Name (string) |
---|---|
555 | Alice |
666 | Bob |
555 | Alice |
999 | Chloe |
dataset1
を開始点として、dataset2
に含まれる行を位置によって 保持する場合、結果として得られるセットは以下のようになります。
ID (long) | Name (string) |
---|---|
555 | Alice |
最初のセットには、ID 列が int 型で含まれていましたが、結果として得られるセットでは、long 型になっています。含まれる行を保持するは、Spark のIntersect
関数を使用しています。
dataset1
を開始点として、dataset2
に含まれる行を位置によって 削除する場合、結果として得られるセットは以下のようになります。
ID (long) | Name (string) |
---|---|
666 | Bob |
ここでも、最初のセットには ID 列が int 型で含まれていましたが、結果として得られるセットでは long 型になっています。含まれる行を削除するは、Spark のExcept
関数を使用しています。
データセットを結合した後、結合されたセットのテーブルを表示して、結果が期待通りであるかどうかを確認することが良いでしょう。アクションリボンでTableを選択し、新しい結合セットをスクロールして確認してください。