4.3.3.1 groupByKey나 groupBy 변환 연산자로 데이터 그루핑
groupByKey 변환 연산자는 동일한 키를 가진 모든 요소를 단일 키-값 쌍으로 모은 Pair RDD를 반환한다. 다음 예제를 살펴보자.
(A, 1) (A, 2) (A, (1, 2)) (B, 1) -> (B, (1, 3)) (B, 3) (C, (1)) (C, 1)
결과 RDD는 (K, Iterable[V]) 타입의 요소로 구성된다. 각 요소의 Iterable[V]로 해당 키의 모든 값에 반복문을 적용할 수 있다.
groupBy는 Pair RDD가 아닌 일반 RDD에서도 사용할 수 있으며, 일반 RDD를 Pair RDD로 변환하고 groupByKey를 호출하는 것과 같은 결과를 만들 수 있다. 예를 들어 임의의 T 타입 요소로 구성된 RDD[T]와 T 타입 요소에서 K 타입의 키를 생성하는 함수(f: T => K)를 사용해 다음과 같이 groupBy를 호출할 수 있다. 두 메서드는 같은 결과를 반환한다.
rdd.map(x => (f(x), x)).groupByKey() rdd.groupBy(f)
groupByKey는 각 키의 모든 값을 메모리로 가져오기 때문에 이 메서드를 사용할 때는 메모리 리소스를 과다하게 사용하지 않도록 주의해야 한다. 모든 값을 한꺼번에 그루핑할 필요가 없으면(예: 각 키별 평균을 계산할 때) aggregateByKey나 reduceByKey, foldByKey를 사용하는 것이 좋다. 다른 Pair RDD의 변환 연산자와 마찬가지로 groupByKey와 groupBy 또한 파티션 개수를 받는 버전과 사용자 정의 Partitioner를 받는 버전을 추가로 제공한다.