注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

データセットの結合

Contourでは、結合を実行するためのいくつかの異なるボードが提供されています。このガイドでは、(1)データセットを結合するために各ボードをどのように使用するか、(2)各ボードのSQLとの対応関係、(3)パフォーマンスに関する考慮事項について説明します。


Join ボード

Join ボードを使用すると、現在作業中のデータセットを別のデータセットに結合し、一致する結果をユーザーのデータにマージすることができます。以下に概要を示します:

contour-join

ユーザーが顧客による購入情報を含むテーブルを持っているとします。

customer_iditem_idpurchase_dateprice
1019991/1/200050
1219971/1/200035

ユーザーがインベントリ内のすべてのアイテムに関する情報を含む第二のテーブルを持っている場合:

item_iditemweight_kg
999Toaster oven1
997Frying pan0.5

ユーザーは join ボードを使用して、スタートのデータセット(transactions)を購入された各アイテムの情報で強化することができます。

データセットに同じ名前の行がある場合、Contourは行名に接頭辞を追加するように求めます。この場合、両方のデータセットに item_id という行が存在します。私たちは、新たに来るデータセットからの行に "inv"(inventory の略)という接頭辞を適用します。

結合した結果のデータセットに重複する item_id 行を追加したくない場合は、新たに来るデータセットからその行を選択解除することができます。

join-board

強化されたデータセットは以下のようになります:

customer_iditem_idpurchase_datepriceinv_iteminv_weight_kg
1219971/1/200035Frying pan0.5
1019991/1/200050Toaster oven1

Join ボードの設定

実行する結合タイプを選択します:左結合(Add columns)、内部結合(Intersection)、右結合(Switch to dataset)、または全結合(Incorporate all data, matching rows where possible)。

他のデータセットから現在作業中のセットに追加する行を選択します。デフォルトでは、最初のデータセットからすべての行が返されます。

次に、各セットから1つ以上のキーを選択します。複数の結合キーを使用する場合は、Match Any または Match All 条件を選択することができます。

全結合の場合、2つのデータセットからすべての行が返されます。これは、2つの行が結合されないため、どちらのデータセットの結合行でも null 値が表示される可能性があることを意味します。


Union ボード

Union ボードを使用して、現在のデータセットを別のセットに基づいて変更します。別のデータセットからデータを追加(Add rows)、データセットをフィルター処理して他のデータセットに存在するデータのみを保持(Keep rows)、または他のデータセットに存在するデータに基づいてデータを削除(Remove rows)することができます。ユーザーは、データセット内の行の位置に基づいてマッチングするか、行名に基づいてマッチングを選択することができます。

以下の3つのテーブルを具体的な例として使用します:

people

first_namelast_name
CaseyLinden
JessSage
LeeRose
TaylorOak

candidates

first_namesurname
JessSage
LeeRose
JamieWood

candidates_backward

last_namefirst_name
SageJess
RoseLee
WoodJamie

ユーザーは人々のテーブルを持っており、それを2つの候補者のテーブルと比較したいと考えています。両方のテーブルは people テーブルと同じスキーマを持っていません。以下のセクションでは、テーブルでどの比較(セットの数学)を行うかによって、結果のセットがどのようになるかを示します。

例: 行の追加

people テーブルを基にして、candidates_backward テーブルから By name行を追加すると、結果のセットは次のようになります:

first_namelast_name
CaseyLinden
JessSage
LeeRose
TaylorOak
JessSage
LeeRose
JamieWood

people テーブルを基にして、candidates_backward テーブルから By position行を追加すると、結果のセットは people テーブルの名前を candidates_backward テーブルの姓に追加し、その逆を行います。これはおそらく望ましくない結果です。結果のセットは次のようになります:

first_namelast_name
CaseyLinden
JessSage
LeeRose
TaylorOak
SageJess
RoseLee
WoodJamie

ユーザーは、行名が一致しないが、名前と姓の行の位置が一致するため、people テーブルから candidates テーブルに By postion行を追加したいと思うでしょう。開始セットから行名が取られることに注意してください:

first_namelast_name
CaseyLinden
JessSage
LeeRose
TaylorOak
JessSage
LeeRose
JamieWood

例: 行の保持

people テーブルを基にして、Union ボードを設定して candidates テーブルに By position表示される行を保持すると、結果のセットは次のようになります:

first_namelast_name
JessSage
LeeRose

people テーブルを基にして、Union ボードを設定して candidates_backward テーブルに By name表示される行を保持すると、結果のセットは次のようになります:

first_namelast_name
JessSage
LeeRose

例: 行の削除

people テーブルを基にして、candidates テーブルに By position表示される行を削除すると、結果のセットは次のようになります:

first_namelast_name
CaseyLinden
TaylorOak

people テーブルを基にして、candidates_backward テーブルに By name表示される行を削除すると、結果のセットは次のようになります:

first_namelast_name
CaseyLinden
TaylorOak

代わりに people テーブルから始めて、candidates_backward テーブルに By position表示される行を削除すると、結果のセットは以下のようになります。このテーブルは位置に基づいてマッチングしたときに candidates_backward テーブルに表示された行がなかったため、people テーブルと同一です。

first_namelast_name
CaseyLinden
JessSage
LeeRose
TaylorOak

Union ボードの設定

Keep rowsAdd rows、または Remove rows を選択し、比較したいセットを選択します。

Keep rowsRemove rows の場合、Appear in または Match on を選択することができます。

  • Appear in を使用するときは、By position または By name でマッチングを選択することができます。
  • Match on を使用するときは、結合する行を指定する必要があります(各セットから1行)。
警告

Unionを実行するときは、両方のデータセットが同じ数の行を持つ必要があります。したがって、Union ボードを使用するときは、スキーマが変更される可能性がある場合は注意が必要です。たとえば、ピボットされたデータに切り替えられたピボットテーブルの下流のUnion ボードは、スキーマの変更により予期せぬ列の数の変更を受ける可能性があります。


SQLとの対応関係

SQLに慣れているユーザーにとっては、Contourの結合操作をSQLの同等のものとして考えることが有用かもしれません。 以下の表は、どのボードがどのSQL結合タイプをサポートしているかを示しています:

ボードUnionLeft joinRightOuterInner
JoinXXXX
UnionXX

Join

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

このSQL文は、Lテーブルから全てのレコードを選択し、Rテーブルと左外部結合を行います。結合条件は、LテーブルとRテーブルの指定された結合列が一致するレコードに対して行われます。その結果から、Rテーブルの指定された結合列がnullのレコードのみを抽出します。つまり、これはLテーブルには存在するがRテーブルには存在しないレコードを取得するためのSQL文です。

データ型

ヒント

結果として得られるセットを調べて、データ型が期待通りであることを確認してください。

ユニオンボードを使用する際には、行のデータ型に注意してください。互換性のある列の型はキャストされます。具体的な例として、2つのデータセットを使ってみましょう。

dataset1

ID (int)Name (string)
555Alice
666Bob

dataset2

ID (long)Name (string)
555Alice
999Chloe

dataset1 を開始点として、dataset2 から位置による 行の追加を行うと、結果として得られるセットは以下のようになります。

ID (long)Name (string)
555Alice
666Bob
555Alice
999Chloe

dataset1 を開始点として、dataset2含まれる行を位置によって 保持する場合、結果として得られるセットは以下のようになります。

ID (long)Name (string)
555Alice

最初のセットには、ID 列が int 型で含まれていましたが、結果として得られるセットでは、long 型になっています。含まれる行を保持するは、Spark のIntersect 関数を使用しています。

dataset1 を開始点として、dataset2含まれる行を位置によって 削除する場合、結果として得られるセットは以下のようになります。

ID (long)Name (string)
666Bob

ここでも、最初のセットには ID 列が int 型で含まれていましたが、結果として得られるセットでは long 型になっています。含まれる行を削除するは、Spark のExcept 関数を使用しています。


パフォーマンスに関する注意点

  • 2つのテーブルを結合するためのキーを選択する際には、できるだけ一意のID(プライマリキーなど)を使用するようにしてください。外部キーによる結合は、Spark をクラッシュさせる可能性があるため、強くお勧めしません。
  • 複雑な結合や式の後には、データセットとして保存機能を使って作業を「保存」しておくことをお勧めします。これにより、結合がディスクに永続化されるため、下流のクエリのパフォーマンスが向上します。

結果の確認

データセットを結合した後、結合されたセットのテーブルを表示して、結果が期待通りであるかどうかを確認することが良いでしょう。アクションリボンでTableを選択し、新しい結合セットをスクロールして確認してください。