IT/Spark

Spark - Pair RDD

물통꿀꿀이 2020. 2. 1. 20:46

Pair RDD는 key-value 형태의 RDD 묶음(?)이다.

Spark에서 pair RDD가 중요한 이유는 일반적으로 대용량 데이터 처리는 key-value 형태에서 수행하기 때문이다.

그런데 익숙하게도 key-value 형태는 여러 언어에서 사용하고 있다. (아래 Scala, Python 참조)

Scala

Python

def val collection = Map(

  "A" -> 1,

  "B" -> 2,

  "C" -> 3

)

collection = {

  "A" : 1,

  "B" : 2,

  "C" : 3

} 


이 때문인지는 모르겠지만, 대용량 데이터 처리를 위한 분산 시스템 환경에서는 key-value 형태가 매우 중요하다.

그도 그럴 것이 분산 데이터 처리의 기반을 닦은 Google의 MapReduce가 key-value 기반이다. (자세한 것은 https://research.google/pubs/pub62/ 참조)


돌아와서 Spark는 key-value 형태를 Pair RDD라고 한다.

기본적으로는 생성은 val pairRdd = rdd.map(...) 와 같고, 생성된 Pair RDD를 바탕으로 사용하는 메소드는 아래와 같이 여럿 존재한다.

Transformation 

Action 

groupByKey

countByKey 

reduceByKey 

 

mapValues

 

keys 

 

join

 

leftOuterJoin/rightOuterJoin

 


group에 대한 이해를 위해 scala 예시를 먼저 들어보면,

def group(age: Int): String = {
if (age >= 18 && age < 65) "adult"
else if (age < 18) "child"
else "senior"
}
val ages = List(2, 52, 44, 23, 17, 14, 12, 82, 51, 64)
val grouped = ages.groupBy(group)

결과는 HashMap(child -> List(2, 17, 14, 12), adult -> List(52, 44, 23, 51, 64), senior -> List(82)) 이다.

즉, List의 값을 특정 조건에 맞춰 분류된다.


Spark는 비슷하게 groupByKey 메소드를 사용하면,

val wordCounts = textFile.flatMap(line => line.split(" ")).groupByKey(identity).count()

 Array[(String, Long)] = Array((online,1), (graphs,1), (["Parallel,1), (["Building,1), (thread,1), (documentation,3), (command,,2), (abbreviated,1), (overview,1), (rich,1), (set,2), (-DskipTests,1), (name,1), (page](http://spark.apache.org/documentation.html).,1), (["Specifying,1), (stream,1), (run:,1), (not,1), (programs,2), (tests,2), (./dev/run-tests,1), (will,1), ([run,1), (particular,2), (option,1), (Alternatively,,1), (by,1), (must,1), (using,5), (you,4), (MLlib,1), (DataFrames,,1) ... 

위와 같이 key에 의해 분류된 결과를 확인 할 수 있다.


다시 정리해보면, Pair RDD는 분산 환경에 많은 데이터를 처리하는데 효과적이다.