터칭 데이터

Aggregation - JOIN 본문

하둡과 Spark

Aggregation - JOIN

터칭 데이터 2024. 1. 18. 13:30

 

 

Contents

 

1. Spark SQL 소개

 

2. Aggregation, JOIN, UDF

 

3. Spark SQL 실습

 

4. Hive 메타스토어 사용하기

 

5. 유닛 테스트

 

 

 

 

 

 

 

 

 

 

 

Aggregation, JOIN, UDF


다양한 Aggregation과 JOIN 방식과 UDF에 대해 살펴보자

 

 

 

 

 

 

 

 

 

Aggregation 함수

 

❖ DataFrame이 아닌 SQL로 작성하는 것을 추천

 

❖ 뒤에서 실습시 예를 몇 가지 SQL로 살펴볼 예정

 

❖ Group By

SUM, MIN, MAX, AVG, COUNT

 

❖ Window

ROW_NUMBER, FIRST_VALUE, LAST_VALUE

 

❖ Rank

 

 

 

 

 

 

 

 

 

 

 

 

JOIN

 

SQL 조인은 두 개 혹은 그 이상의 테이블들을 공통 필드를 가지고 머지

 

스타 스키마로 구성된 테이블들로 분산되어 있던 정보를 통합하는데 사용

 

왼쪽 테이블을 LEFT라고 하고 오른쪽 테이블을 RIGHT이라고 하면

JOIN의 결과는 방식에 따라 양쪽의 필드를 모두 가진 새로운 테이블을 생성
조인의 방식에 따라 다음 두 가지가 달라짐
    - 어떤 레코드들이 선택되는지?
    - 어떤 필드들이 채워지는지?

 

 

 

 

 

 

 

 

 

 

 

 

다양한 종류의 조인

https://theartofpostgresql.com/blog/2019-09-sql-joins/

 

 

 

 

 

 

 

 

 

 

 

JOIN 실습 - 예제 데이터 준비

 

 

VitalID는 Vital 테이블의 Primary Key로 1부터 1씩 점증적으로 증가합니다. (Auto Increment)

AlertID는 Alert 테이블의 Primary Key로 1부터 1씩 점증적으로 증가합니다. (Auto Increment)

 

 

 

 

 

 

 

 

 

 

JOIN 실습 - INNER JOIN


1. 양쪽 테이블에서 매치가 되는 레코드들만 리턴함
2. 양쪽 테이블의 필드가 모두 채워진 상태로 리턴됨

 

SELECT * FROM Vital v
JOIN Alert a ON v.vitalID = a.vitalID;

 

 

 

 

 

 

 

 

 

 

 

JOIN 실습 - LEFT JOIN


1. 왼쪽 테이블(Base)의 모든 레코드들을 리턴함
2. 오른쪽 테이블의 필드는 왼쪽 레코드와 매칭되는 경우에만 채워진 상태로 리턴됨

 

SELECT * FROM raw_data.Vital v
LEFT JOIN raw_data.Alert a ON v.vitalID = a.vitalID;

 

 

 

 

 

 

 

 

 

 

JOIN 실습 - FULL JOIN


1. 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들을 리턴함
2. 매칭되는 경우에만 양쪽 테이블들의 모든 필드들이 채워진 상태로 리턴됨

 

SELECT * FROM raw_data.Vital v
FULL JOIN raw_data.Alert a ON v.vitalID = a.vitalID;

 

 

 

 

 

 

 

 

 

 

 

 

JOIN 실습 - CROSS JOIN


1. 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들의 조합을 리턴함

 

SELECT * FROM raw_data.Vital v CROSS JOIN raw_data.Alert a;

 

 

 

 

 

 

 

 

 

 

 

 

 

JOIN 실습 - SELF JOIN


1. 동일한 테이블을 alias를 달리해서 자기 자신과 조인함

 

SELECT * FROM raw_data.Vital v1
JOIN raw_data.Vital v2 ON v1.vitalID = v2.vitalID;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

위에서 문법적 측면에서 6가지의 JOIN을 살펴봤습니다만

 

실제 Spark으로 JOIN을 하다보면 최적화가 필요합니다. 왜냐하면 DataSet의 크기가 크다면 파티션이 여러 개일 것이고 JOIN을 하는 키를 바탕으로 셔플링이 발생합니다. 셔플링 이후 만들어지는 파티션에 Skew가 생길 수 있습니다. 셔플 자체를 피하는 것이 퍼포먼스 측면에서 중요하며 이를 위한 다양한 최적화 방법들이 있습니다.

 

현재는 간단하게 최적화 관점에서의 조인들을 살펴 본 다음 이후에 Spark 고급 세션에서 더 자세하게 설명드리겠습니다.

 

최적화 관점에서 본 조인의 종류들

 

Shuffle JOIN

● 일반 조인 방식
● Bucket JOIN: 조인 키를 바탕으로 새로 파티션을 새로 만들고 조인을 하는 방식

 

Broadcast JOIN

● 큰 데이터와 작은 데이터 간의 조인
● 데이터 프레임 하나가 충분히 작으면 작은 데이터 프레임을 다른 데이터 프레임이 있는 서버들로 뿌리는 것 (broadcasting)

    - spark.sql.autoBroadcastJoinThreshold 파라미터로 충분히 작은지 여부 결정

 

 

 

 

 

 

 

 

 

 

 

JOIN을 그림으로 이해하기

 

양쪽 데이터 프레임 모두 셔플링이 되므로 최적화 관점에서는 다소 비권장

 

 

 

 

 

 

 

 

Broadcast JOIN을 그림으로 이해하기

 

RIGHT 데이터프레임 전체를 LEFT 데이터프레임의 파티션들이 있는 서버로 복사해서 Shuffling의 양을 최소화

 

 

 

 

 

 

'하둡과 Spark' 카테고리의 다른 글

UDF 실습  (0) 2024.01.18
UDF(User Defined Function)  (0) 2024.01.18
Spark SQL 소개  (0) 2024.01.18
Intro  (0) 2024.01.18
요약  (0) 2024.01.18