책의 깃허브 저장소를 복제했다면 first-edition/ch04 디렉터리에서 ch04_data_transactions.txt 파일1을 찾을 수 있다(책의 깃허브 저장소를 복제하지 않았다면 https://github.com/spark-in-action/first-edition/tree/master/ch04에서 해당 파일을 내려받을 수 있다).
예제 파일의 각 줄에는 구매 날짜, 시간, 고객 ID, 상품 ID, 구매 수량, 구매 금액이 순서대로 기록되어 있으며 각 항목은 해시 기호(#)로 구분된다. 이제 다음 코드를 실행해 예제 파일의 구매 로그들을 Pair RDD로 변환하자. 이 Pair RDD의 키는 고객 ID이며, 값에는 각 구매 로그(예제 파일의 각 줄)의 모든 정보가 저장된다.
scala> val tranFile = sc.textFile("first-edition/ch04/"+"ch04_data_transactions.txt") ---- ❶ 데이터를 로드한다. scala> val tranData = tranFile.map(_.split("#")) ---- ❷ 데이터를 파싱한다. scala> var transByCust = tranData.map(tran => (tran(2).toInt, tran)) ---- ❸ Pair RDD를 생성한다.
코드를 실행하면 ❶ tranFile에는 파일의 줄이 포함되며, ❷ tranData에는 해시 문자로 파싱한 데이터가 문자열 배열 형태로 저장된다. 마지막 ❸에서는 파싱한 데이터(tran)를 튜플로 매핑해 transByCust Pair RDD를 만든다. tran 배열에서 고객 ID는 세 번째(인덱스 2번)에 위치하므로 이 값을 정수형으로 변환해 튜플의 첫 번째 요소로 지정했다. 튜플의 두 번째 요소에는 tran 배열 자체를 저장했다. transByCust를 값(val)이 아닌 변수(var)로 선언했기 때문에 기존의 구매 기록과 사은품들을 단일 변수에 계속 유지하면서 갱신할 수 있다.2
1 이 파일은 Mockaroo 웹 사이트(https://www.mockaroo.com)의 데이터로 생성했다.
2 역주 transByCust 변수를 줄곧 갱신하며 재사용하지만 RDD는 불변하는 성질이 있으므로 데이터 자체는 계속 새로 생성된다.