아파치 스파크 foldByKey
아파치 스파크 foldByKey(Apache Spark foldByKey)는 RDD에서 키별로 값을 집계하는 연산이다. 이 연산은 주로 키-값 쌍으로 이루어진 RDD에서 각 키에 대한 값을 누적하는 데 사용된다. foldByKey는 키별로 값을 "접기(folding)" 작업을 하여, 병렬 환경에서 데이터를 효율적으로 처리할 수 있게 해준다.
1 개요[edit | edit source]
foldByKey는 두 개의 인수를 사용하여 RDD의 각 키에 대해 값을 병합하는 연산이다. 이 연산은 RDD의 각 파티션에서 로컬로 값을 접고, 전체 클러스터에서 전역적으로 값이 병합된다.
- 첫 번째 인수는 파티션 내에서 병합하는 데 사용되는 연산자(예: 덧셈, 곱셈 등)이다.
- 두 번째 인수는 각 키에 대해 병합을 시작하는 초기값이다.
foldByKey는 기본적으로 reduceByKey와 유사하지만, 초기값을 제공하는 점에서 차이가 있다. 이로 인해 병합 작업을 수행하기 전에 각 키에 대해 시작값을 설정할 수 있다.
2 사용법[edit | edit source]
foldByKey는 RDD에서 키별로 값을 집계할 때 매우 유용하다. 주로 `pair RDD`에서 사용되며, 키-값 쌍을 기준으로 연산을 수행한다.
from pyspark import SparkContext
sc = SparkContext("local", "FoldByKey Example")
# 키-값 쌍으로 구성된 RDD
rdd = sc.parallelize([("a", 1), ("b", 2), ("a", 3), ("b", 4)])
# foldByKey 적용: 첫 번째 인수는 덧셈 연산, 두 번째 인수는 초기값 0
result = rdd.foldByKey(0, lambda x, y: x + y)
print(result.collect())
위 코드에서 foldByKey는 `("a", 1)`, `("a", 3)`을 합쳐 `"a"` 키에 대해 4를, `("b", 2)`와 `("b", 4)`를 합쳐 `"b"` 키에 대해 6을 결과로 반환한다.
3 foldByKey와 reduceByKey의 차이점[edit | edit source]
reduceByKey와 foldByKey는 유사하지만 중요한 차이가 있다:
- reduceByKey: 키별로 값을 병합할 때 초기값을 설정할 수 없다. 즉, 각 키에 대해 값을 병합할 때는 첫 번째 값이 자동으로 사용된다.
- foldByKey: 키별로 값을 병합할 때 초기값을 설정할 수 있다. 병합 작업을 시작할 때 각 키에 대해 특정 초기값을 제공할 수 있어 더 유연하다.
4 응용[edit | edit source]
foldByKey는 다음과 같은 다양한 상황에서 유용하게 사용된다:
- 데이터 집계
- 키별로 데이터를 집계하고, 초기값을 지정하여 합계, 평균 등의 계산을 수행할 수 있다.
- 통계 처리
- 각 키에 대한 값의 합계를 구하거나, 복잡한 통계적 계산을 수행할 때 사용될 수 있다.
- 분산 환경에서의 집계
- 클러스터 환경에서 데이터를 분산 처리하며, 키별로 값을 효율적으로 집계할 수 있다.
5 예제 1: 숫자의 합계 구하기[edit | edit source]
다음은 foldByKey를 사용하여 키별로 숫자의 합계를 구하는 예시이다:
rdd = sc.parallelize([("a", 1), ("a", 2), ("b", 3), ("b", 4)])
# foldByKey로 값의 합계를 구한다. 초기값은 0
result = rdd.foldByKey(0, lambda x, y: x + y)
print(result.collect()) # 출력: [('a', 3), ('b', 7)]
이 예제에서는 `"a"`와 `"b"`에 대해 각 키에 해당하는 값들의 합계를 구했다.
6 예제 2: 문자열 연결하기[edit | edit source]
foldByKey는 숫자뿐만 아니라 문자열에도 적용할 수 있다. 아래는 각 키에 대해 문자열을 연결하는 예제이다:
rdd = sc.parallelize([("a", "hello"), ("b", "world"), ("a", "spark"), ("b", "apache")])
# foldByKey로 문자열을 연결한다. 초기값은 빈 문자열
result = rdd.foldByKey("", lambda x, y: x + " " + y)
print(result.collect()) # 출력: [('a', 'hello spark'), ('b', 'world apache')]
위 예제에서는 각 키에 대해 문자열을 연결하였다.
7 같이 보기[edit | edit source]
8 참고 문헌[edit | edit source]
- Zaharia, Matei, et al. "Spark: Cluster Computing with Working Sets." USENIX, 2010.
- Chambers, Bill, and Zaharia, Matei. "Spark: The Definitive Guide." O'Reilly Media, 2018.