아파치 스파크 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 연산의 차이를 비교한 표이다.
연산 | 설명 | 셔플링 발생 여부 | 사용 예제 |
---|---|---|---|
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은 액션 연산이므로 전체 데이터를 가져오므로 사용 시 주의해야 한다.