저스틴의 대답은 대단하고이 반응은 더 깊이 들어가게됩니다.
이 repartition알고리즘은 전체 셔플을 수행하고 고르게 분산 된 데이터로 새 파티션을 만듭니다. 1에서 12까지의 숫자로 DataFrame을 만듭니다.
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf 내 컴퓨터에 4 개의 파티션이 있습니다.
numbersDf.rdd.partitions.size // => 4
파티션에서 데이터를 나누는 방법은 다음과 같습니다.
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
이 repartition방법 으로 전체 셔플을 수행하고 두 노드에서이 데이터를 가져 오 겠습니다 .
val numbersDfR = numbersDf.repartition(2)
numbersDfR내 컴퓨터 에서 데이터가 분할되는 방법은 다음과 같습니다 .
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
이 repartition방법을 사용하면 새 파티션을 만들고 새 파티션에 데이터를 균등하게 분배 할 수 있습니다 (데이터 분배는 더 큰 데이터 세트에 대해 더 균일합니다).
차이 사이 coalesce와repartition
coalesce기존 파티션을 사용하여 섞은 데이터 양을 최소화합니다. repartition새 파티션을 만들고 전체 셔플을 수행합니다. coalesce데이터 양이 다른 파티션 (때로는 크기가 다른 파티션)을 생성하고 크기 repartition가 거의 같은 파티션을 생성합니다.
인가 coalesce또는 repartition빠른?
coalesce보다 빠른 실행이 가능 repartition하지만 크기가 다른 파티션은 일반적으로 같은 크기의 파티션보다 작동 속도가 느립니다. 일반적으로 큰 데이터 세트를 필터링 한 후 데이터 세트를 다시 파티셔닝해야합니다. 내가 발견 한 repartition스파크가 동일한 크기의 파티션 작업에 내장되어 있기 때문에 빠른 전체로.
주의 : 재 파티션으로 인해 디스크의 데이터 크기가 증가 할 수 있다는 것이 궁금 합니다. 대규모 데이터 세트에서 재 파티셔닝 / 연합을 사용할 때 테스트를 실행하십시오.
더 자세한 내용을 원하시면 이 블로그 게시물을 읽으십시오 .
실제로 통합 및 재 파티셔닝을 사용할 때
minimize data movement대신에 더 잘 말해야합니다avoiding data movement.