map과 flatMap은 spark transformation의 대표적인 연산입니다. 이 둘을 사용해보고 차이점이 무엇인지 살펴보겠습니다. pyspark을 이용합니다.
map
spark의 map은 scala나 python에서 제공하는 map과 크게 다르지 않습니다. python에서 제공하는 map은 다음과 같습니다.
- 함수를 인자로 갖고,
- 리스트와 같은 iterable 자료구조의 모든 요소에 그 함수를 적용시키고,
- 그 결과로 구성된 map 객체를 다시 돌려줍니다.
spark의 map도 자료구조가 RDD라는 점이 다르고 작동은 비슷합니다.
1 |
|
RDD의 모든 요소에 동일한 lambda 함수가 적용된 것을 볼 수 있습니다.
flatMap
map과 유사하게 동작하지만, flatMap의 반환 타입은 map과는 조금 다릅니다.
아래는 rdd.py 클래스에 정의되어 있는 map과 flatMap입니다.
1 |
|
map은 python이 제공하는 map만을 사용하는데, flatMap은 itertools의 chain.from_iterable을 사용합니다.
https://docs.python.org/3/library/itertools.html#itertools.chain.from_iterable
공식문서의 설명을 보아, iterable 객체의 각 요소를 한 단계 더 작은 단위로 쪼개는 기능임을 알 수 있습니다.
1 |
|
flatMap의 기능도 쉽게 예측할 수 있습니다. map과 어떻게 다른지 비교해보겠습니다.
1 |
|
map의 기능은 rdd 각 요소에 함수를 적용시키는 것까지입니다.
flatMap은 map으로 얻은 결과의 각 요소를 끄집어내는 것까지입니다.
리스트가 아니라 string은 어떨까요?
1 |
|
새로운 rdd의 요소가 join으로 얻은 문자열을 전부 펼친 문자인 것을 볼 수 있습니다.