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는 분산 환경에 많은 데이터를 처리하는데 효과적이다.
'IT > Spark' 카테고리의 다른 글
Spark - RDD Dependency (0) | 2020.02.05 |
---|---|
Spark - Partitioning (0) | 2020.02.04 |
Spark - Shuffling (0) | 2020.02.03 |
Spark - Reduction In Parallel (0) | 2020.02.01 |
Spark - RDDs (0) | 2020.01.24 |
댓글