1. Broadcast Join
- 모든 executor의 메모리에 복사하여 shuffle 없이 join하는 방식
- 모든 executor와 driver의 memory에 충분한 공간이 있어야함.
- 일반적으로 사이즈가 작은 master성 테이블(dimemsion 테이블)에 적용
- 하나의 테이블이 2GB(8GB in spark3.0>) 이하인 경우 사용가능 (default < 10M otherwise use Hint)
- base table에는 적용되지 않음.
- full outer join 외에 모두 적용 가능함.
- equi join(==) 에만 적용됨.
- 모든 노드에서 개별적으로 조인이 수행되므로 CPU가 가장 큰 병목구간이 된다.
2. Shuffled Hash Join(SHJ)
- 작은 테이블에 대해 hash table을 만들어 메모리에 올리고 shuffle > 큰 테이블 shuffle 해서 각각 대응되는 파티션이 같은 key값을 가지도록 만들어 join하는 방식
- hash table을 메모리에 올리기에 memory에 부하가 있음.
- OOM(Out Of Memory)에 취약함
- full outer join 외에 모두 적용 가능함.
- equi join(==) 에만 적용됨.
- broadcast 될 정도는 아니지만 한쪽 테이블이 상대적으로 많이 작은 경우 SMJ보다 빠를 가능성이 있음.
3. Sort Merge Join(SMJ)
- join key 기준 정렬이 되도록 shuffle 후에 join하는 방식
- 가장 일반적인 join stategy임.
- memory spill은 디스크에 저장되어 OOM이 잘 일어나지 않음.
- join key가 sortable 해야함.
- full outer join 까지 모두 적용 가능함.
- equi join(==) 에만 적용됨.
- Bucketing 을 통해 최적화 가능
4. Broadcast Nested Loop Join(BNLJ)
- used for non-equi joins(>, <)
- 만약 하나의 테이블이 상대적으로 작다면 Broadcast join과 같은 방식으로 풀리지만, 크다면 cartesian product로 풀림.