더북(TheBook)

4.3.2.4 top과 takeOrdered로 정렬된 요소 가져오기

takeOrdered(n)이나 top(n) 행동 연산자를 사용해 RDD 상위 또는 하위 n개 요소를 가져올 수 있다. 임의의 T 타입 요소로 구성된 RDD에서 상위 또는 하위 요소는 스코프 내에 정의된 암시적 Ordering[T] 객체를 기준으로 결정된다.

따라서 Pair RDD에서 toptakeOrdered는 (sortByKey처럼) 키를 기준으로 요소를 정렬하는 것이 아니라 (K, V) 튜플을 기준으로 요소를 정렬한다. Pair RDD에 이 메서드를 사용하려면 암시적 Ordering[(K, V)]객체를 스코프 내에 정의해야 한다(키와 값이 기본 타입일 때는 이미 Ordering 객체가 정의되어 있다).

toptakeOrdered는 전체 데이터를 정렬하지 않는다. 그 대신 각 파티션에서 상위(또는 하위) n개 요소를 가져온 후 이 결과를 병합하고, 이 중 상위(또는 하위) n개 요소를 반환한다. 따라서 toptakeOrdered 연산자는 훨씬 더 적은 양의 데이터를 네트워크로 전송하며, sortBytake를 개별적으로 호출하는 것보다 무척 빠르다. 하지만 collect와 마찬가지로 모든 결과를 드라이버의 메모리로 가져오기 때문에 n에 너무 큰 값을 지정해서는 안 된다.

정렬을 설명하다 보니 너무 멀리 와 버린 것 같다. 우리는 지금까지 어제 판매하지 않은 상품 목록을 추출했고, 다양한 메서드를 사용해 어제 판매한 상품별 매출액 목록과 상품 데이터를 조인했다. 또 상품 이름을 기준으로 결과를 정렬할 수 있었다.

이제 남은 업무는 하나뿐이다. 어제 구매 기록을 바탕으로 고객이 구입한 상품의 평균, 최저 가격, 최고 가격, 구매 금액의 합계를 계산해야 한다. 구매 기록 파일에는 고객과 상품 조합이 줄 하나, 즉 RDD 요소 하나로 구성되므로 이 통계를 계산하기 앞서 데이터를 고객별로 그루핑해야 한다. 그런 다음 다양한 방법으로 통계를 계산할 수 있다. 이 예제에서는 데이터를 그루핑하려고 combineByKey 변환 연산자를 사용한다. 먼저 데이터 그루핑이 무엇인지 알아보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.