DataPipeline/Spark

스파크완벽가이드 - 8장 조인

wave35 2024. 8. 7. 14:30

 

8.1 조인 표현식

- 스파크는 왼쪽과 오른쪽 데이터셋에 있는 하나 이상의 키값을 비교하여 데이터셋을 조인 함
- 스파크는 일치하는 키가 없는 로우는 조인에 포함시키지 않음

 

 

8.2 조인 타입

- inner join
- outer join 
- left outer join 
- right outer join
- left semi join
- left anti join
- natural join
- cross join

- 예제를 위한 Data 생성

person = spark.createDataFrame([
    (0, "Bill Chambers", 0, [100]),
    (1, "Matei Zaharia", 1, [500, 250, 100]),
    (2, "Michael Armbrust", 1, [250, 100])])\
  .toDF("id", "name", "graduate_program", "spark_status")
  
graduateProgram = spark.createDataFrame([
    (0, "Masters", "School of Information", "UC Berkeley"),
    (2, "Masters", "EECS", "UC Berkeley"),
    (1, "Ph.D.", "EECS", "UC Berkeley")])\
  .toDF("id", "degree", "department", "school")

sparkStatus = spark.createDataFrame([
    (500, "Vice President"),
    (250, "PMC Member"),
    (100, "Contributor")])\
  .toDF("id", "status")
  
person.createOrReplaceTempView("person")
graduateProgram.createOrReplaceTempView("graduateProgram")
sparkStatus.createOrReplaceTempView("sparkStatus")

 

 

8.10 교차 조인 (카테시안 조인)

- 왼쪽 DF의 모든 로우를 오른쪽 DF의 모든 로우와 결합
- 1,000개의 로우가 존재하는 2개의 DF에 교차조인을 수행하면 1,000 * 1000개의 로우 결과가 생성

person.crossJoin(graduateProgram).show()
+---+----------------+----------------+---------------+---+-------+--------------------+-----------+
| id|            name|graduate_program|   spark_status| id| degree|          department|     school|
+---+----------------+----------------+---------------+---+-------+--------------------+-----------+
|  0|   Bill Chambers|               0|          [100]|  0|Masters|School of Informa...|UC Berkeley|
|  0|   Bill Chambers|               0|          [100]|  2|Masters|                EECS|UC Berkeley|
|  0|   Bill Chambers|               0|          [100]|  1|  Ph.D.|                EECS|UC Berkeley|
|  1|   Matei Zaharia|               1|[500, 250, 100]|  0|Masters|School of Informa...|UC Berkeley|
|  1|   Matei Zaharia|               1|[500, 250, 100]|  2|Masters|                EECS|UC Berkeley|
|  1|   Matei Zaharia|               1|[500, 250, 100]|  1|  Ph.D.|                EECS|UC Berkeley|
|  2|Michael Armbrust|               1|     [250, 100]|  0|Masters|School of Informa...|UC Berkeley|
|  2|Michael Armbrust|               1|     [250, 100]|  2|Masters|                EECS|UC Berkeley|
|  2|Michael Armbrust|               1|     [250, 100]|  1|  Ph.D.|                EECS|UC Berkeley|
+---+----------------+----------------+---------------+---+-------+--------------------+-----------+

 

 

8.11 조인 사용시 문제점

- 복합 데이터 타입의 조인
    ㄴ 불리언을 반환하는 모든 표현식은 조인 표현식으로 간주
- 중복 컬럼명 처리
    ㄴ 조인 전에 중복된 컬럼을 삭제하거나, 컬럼명을 변경하여 문제 해결

 

 

8.12 스파크 조인 수행 방식

조인을 수행하는 두 가지 핵심 전략
- 노드간 네트워크 통신 전략
- 노드별 연산 전략

전체 노드 간 통신을 유발하는 셔플 조인과 그렇지 않은 브로드캐스트 조인

 

셔플 조인 

큰 테이블과 큰테이블 간의 조인, 모든 워커 노드에서 통신(데이터 이동)이 발생

 

브로드캐스트 조인

큰 테이블과 작은 테이블 간의 조인, 작은 DF를 클러스터 전체 워커에 복제해 모든 워커노드에 통신이 발생하지 않게끔 함