저스틴의 대답은 대단하고이 반응은 더 깊이 들어가게됩니다.
이 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
.