아파치 스파크 Pair RDD 연산

IT 위키

Apache Spark Pair RDD 연산(Apache Spark Pair RDD Operations)은 Apache Spark에서 키-값(Key-Value) 형태의 RDD(Pair RDD)를 다룰 때 사용하는 변환(Transformation) 및 액션(Action) 연산을 의미한다. Pair RDD는 분산 데이터 처리에서 데이터를 그룹화하거나 조인하는 등의 연산을 수행하는 데 필수적이다.

1 개요[편집 | 원본 편집]

Pair RDD는 (K, V) 형태로 구성된 RDD로, 키를 기준으로 그룹화(grouping), 조인(join), 집계(aggregation) 등의 연산을 수행할 수 있다.

  • 변환 연산(Transformations)
    • Pair RDD를 변환하여 새로운 RDD를 생성하는 연산
    • 예: reduceByKey, groupByKey, mapValues
  • 액션 연산(Actions)
    • Pair RDD의 데이터를 최종적으로 반환하는 연산
    • 예: countByKey, lookup

2 주요 변환(Transformations) 연산[편집 | 원본 편집]

2.1 1. reduceByKey[편집 | 원본 편집]

키별로 값을 병합하는 연산으로, 동일한 키를 가진 데이터를 같은 파티션에서 사전 연산하여 성능을 최적화한다.

2.1.1 Scala 예제[편집 | 원본 편집]

val rdd = sc.parallelize(Seq(("a", 1), ("b", 2), ("a", 3), ("b", 4), ("a", 5)))
val result = rdd.reduceByKey(_ + _).collect()
result.foreach(println)  
// 출력: ("a", 9), ("b", 6)

2.1.2 Python 예제[편집 | 원본 편집]

rdd = sc.parallelize([("a", 1), ("b", 2), ("a", 3), ("b", 4), ("a", 5)])
result = rdd.reduceByKey(lambda x, y: x + y).collect()
print(result)  
# 출력: [('a', 9), ('b', 6)]

2.2 2. groupByKey[편집 | 원본 편집]

같은 키를 가진 값을 그룹화하는 연산. reduceByKey보다 네트워크 비용이 높아 주의해야 한다.

2.2.1 Scala 예제[편집 | 원본 편집]

val grouped = rdd.groupByKey().mapValues(_.sum).collect()
grouped.foreach(println)
// 출력: ("a", 9), ("b", 6)

2.2.2 Python 예제[편집 | 원본 편집]

grouped = rdd.groupByKey().mapValues(sum).collect()
print(grouped)  
# 출력: [('a', 9), ('b', 6)]

2.3 3. mapValues[편집 | 원본 편집]

값(Value)만 변환하는 연산. 키(Key)는 변경되지 않는다.

2.3.1 Scala 예제[편집 | 원본 편집]

val mapped = rdd.mapValues(_ * 2).collect()
mapped.foreach(println)
// 출력: ("a", 2), ("b", 4), ("a", 6), ("b", 8), ("a", 10)

2.3.2 Python 예제[편집 | 원본 편집]

mapped = rdd.mapValues(lambda x: x * 2).collect()
print(mapped)  
# 출력: [('a', 2), ('b', 4), ('a', 6), ('b', 8), ('a', 10)]

3 주요 액션(Actions) 연산[편집 | 원본 편집]

3.1 1. countByKey[편집 | 원본 편집]

각 키의 개수를 반환하는 연산.

3.1.1 Scala 예제[편집 | 원본 편집]

val count = rdd.countByKey()
println(count)
// 출력: Map(a -> 3, b -> 2)

3.1.2 Python 예제[편집 | 원본 편집]

count = rdd.countByKey()
print(count)
# 출력: {'a': 3, 'b': 2}

3.2 2. lookup[편집 | 원본 편집]

특정 키에 해당하는 모든 값을 반환하는 연산.

3.2.1 Scala 예제[편집 | 원본 편집]

val values = rdd.lookup("a")
println(values)
// 출력: List(1, 3, 5)

3.2.2 Python 예제[편집 | 원본 편집]

values = rdd.lookup("a")
print(values)  
# 출력: [1, 3, 5]

4 Pair RDD 연산 비교[편집 | 원본 편집]

다음은 주요 Pair RDD 연산의 차이를 비교한 표이다.

주요 Pair RDD 연산 비교
연산 설명 셔플링 발생 여부 사용 예제
reduceByKey 키별로 값을 병합 O rdd.reduceByKey(_ + _)
groupByKey 키별로 데이터를 그룹화 O (비효율적) rdd.groupByKey()
mapValues 값만 변환 (키 변경 없음) X rdd.mapValues(_ * 2)
countByKey 각 키의 개수를 반환 X rdd.countByKey()
lookup 특정 키의 값을 조회 X rdd.lookup("a")

5 주의점 및 성능 고려사항[편집 | 원본 편집]

  • Pair RDD에서 reduceByKey는 groupByKey보다 성능이 뛰어나다.
  • mapValues는 키를 유지하면서 값만 변경하므로 효율적이다.
  • countByKey와 lookup은 액션 연산이므로 전체 데이터를 가져오므로 사용 시 주의해야 한다.

6 같이 보기[편집 | 원본 편집]

7 참고 문헌[편집 | 원본 편집]