Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Contour 조인과 집합 연산

Join 보드는 현재 데이터셋에 다른 데이터셋의 열을 결합합니다. Union 보드는 다른 데이터셋을 기준으로 행을 추가하거나 유지, 제거합니다. 열 결합과 행 집합 비교는 반환 열, 중복 및 자료형 처리 방식이 다릅니다.

Join 보드

다음은 가상 구매 테이블 transactions입니다.

customer_iditem_idpurchase_dateprice
1019991/1/200050
1219971/1/200035

inventory에는 상품 정보가 있습니다.

item_iditemweight_kg
999Toaster oven1
997Frying pan0.5

두 테이블의 item_id로 조인하여 구매 내역에 상품과 무게를 추가합니다. 이름이 겹치는 열에는 접두어를 지정할 수 있습니다. 예를 들어 들어오는 열에 inv 접두어를 적용하고, 중복 item_id가 필요하지 않으면 그 열을 선택 해제합니다.

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

유형과 조건

Contour 선택SQL 의미
Add columnsLEFT JOIN
IntersectionINNER JOIN
Switch to datasetRIGHT JOIN
Incorporate all data, matching rows where possibleFULL OUTER JOIN

기본적으로 시작 데이터셋의 열을 반환하며, 추가할 상대 데이터셋의 열을 선택합니다. 각 데이터셋에서 하나 이상의 조인 키를 고릅니다. 여러 조건은 Match All로 모두 일치시키거나 Match Any로 하나 이상 일치시키도록 구성합니다.

Full join은 양쪽 데이터셋의 모든 행을 포함합니다. 양쪽 키 열을 자동으로 하나로 합치는 COALESCE를 수행하지 않으므로, 한쪽에만 있는 행은 상대편 키 열이 null일 수 있습니다.

앞의 구매 예제를 Add columns로 수행하는 SQL 대응은 다음과 같습니다. SQL의 테이블 이름은 위 가상 테이블을 가리킵니다.

SELECT
    t.customer_id,
    t.item_id,
    t.purchase_date,
    t.price,
    i.item AS inv_item,
    i.weight_kg AS inv_weight_kg
FROM transactions AS t
LEFT JOIN inventory AS i
    ON t.item_id = i.item_id

다른 유형은 JOIN 절을 해당 유형으로 바꾸며, 여러 조건은 ON 안에서 AND 또는 OR로 연결합니다.

Union 보드

선택결과
Add rows상대 데이터셋의 행을 추가. 중복 행도 유지
Keep rows상대 데이터셋과 일치하는 행을 남김
Remove rows상대 데이터셋과 일치하는 행을 제거

Add rows의 대응은 중복을 자동으로 제거하는 UNION이 아니라 UNION ALL입니다. 열은 By name 또는 By position으로 대응시킵니다.

Keep rows와 Remove rows에는 두 비교 방식이 있습니다.

  • Appear in은 행 전체를 By name 또는 By position으로 비교합니다.
  • Match on은 양쪽에서 선택한 키 열 한 쌍으로 비교합니다.

행을 추가하거나 Appear in으로 행 전체를 비교할 때는 열 수가 맞아야 합니다. By name은 이름에 맞추고 By position은 순서에 맞추므로 열 수뿐 아니라 각 열의 의미도 확인합니다. 피벗 결과처럼 값에 따라 열 수가 달라지는 입력은 스키마 변경에 주의합니다.

비교할 가상 데이터

people:

first_namelast_name
CaseyLinden
JessSage
LeeRose
TaylorOak

candidates:

first_namesurname
JessSage
LeeRose
JamieWood

candidates_backward:

last_namefirst_name
SageJess
RoseLee
WoodJamie

Add rows와 열 대응

people에 candidates_backward를 By name으로 추가하거나, candidates를 By position으로 추가하면 다음 결과가 됩니다. 결과 열 이름은 시작 데이터셋을 따릅니다.

first_namelast_name
CaseyLinden
JessSage
LeeRose
TaylorOak
JessSage
LeeRose
JamieWood

people에 candidates_backward를 By position으로 추가하면 성과 이름의 위치가 바뀐 채 붙습니다.

first_namelast_name
CaseyLinden
JessSage
LeeRose
TaylorOak
SageJess
RoseLee
WoodJamie

Keep rows

people에서 candidates에 Appear in, By position으로 존재하는 행을 남기거나, candidates_backward와 By name으로 비교하면 다음 두 행이 남습니다.

first_namelast_name
JessSage
LeeRose

Remove rows

같은 두 비교 방식으로 존재하는 행을 제거하면 다음 행이 남습니다.

first_namelast_name
CaseyLinden
TaylorOak

반면 candidates_backward를 By position으로 비교하여 제거하면 이름과 성이 뒤바뀌어 일치하는 행이 없습니다. people의 Casey, Jess, Lee, Taylor 네 행이 모두 남습니다.

키 비교와 SQL 대응

Union 보드의 Keep rows, Match on은 왼쪽 semi join에 해당합니다. 다음 예시는 first_name 하나를 키로 선택합니다. 상대편의 같은 키가 여러 번 있어도 왼쪽 행을 그 횟수만큼 늘리지 않습니다.

SELECT p.*
FROM people AS p
INNER JOIN (
    SELECT DISTINCT first_name
    FROM candidates
) AS candidate_keys
    ON p.first_name = candidate_keys.first_name

Remove rows, Match on은 일치하는 상대 키가 없는 왼쪽 행을 남깁니다. 다음은 그 SQL 대응입니다.

SELECT p.*
FROM people AS p
LEFT OUTER JOIN candidates AS c
    ON p.first_name = c.first_name
WHERE c.first_name IS NULL

Match on은 선택한 키를 비교합니다. last_name과 surname까지 포함한 행 전체가 같아야 하는 Appear in과 구분합니다.

Appear in의 Keep rows는 Spark의 INTERSECT, Remove rows는 EXCEPT에 해당합니다. 이 두 연산은 결과의 중복 행을 제거하는 집합 연산이며, Match on의 semi/anti 방식과 중복 처리 범위가 다릅니다.

호환 자료형 변환

Union 보드는 호환되는 열 자료형을 공통 유형으로 변환할 수 있습니다. 다음 두 가상 입력을 비교합니다.

dataset1:

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

dataset2:

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

By position으로 Add rows하면 ID가 long인 다음 결과를 얻습니다.

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

Keep rows, Appear in, By position은 Alice 한 행을, Remove rows, Appear in, By position은 Bob 한 행을 반환합니다. 두 경우 모두 ID는 시작 입력의 int가 아닌 long입니다.

성능과 결과 확인

가능하면 안정적이고 고유한 키를 사용합니다. 구매의 외래 키가 상품 테이블의 고유 키를 참조하는 조인은 일반적인 보강 방식입니다. 위험한 경우는 양쪽 키가 모두 중복되어 한 키의 왼쪽 m행과 오른쪽 n행이 최대 m×n개의 매칭 행으로 늘어나는 다대다 조인입니다. 이런 증가가 메모리와 계산량을 크게 늘려 Spark 작업 실패로 이어질 수 있습니다.

복잡한 조인과 표현식 뒤에는 결과를 데이터셋으로 저장하여 하위 계산에서 재사용할 수 있습니다. 조인 후 Table 보드로 추가 열과 자료형을 살펴보고 Summary 보드로 행 수를 확인합니다.