반전공자

[PySpark] 액션 - take(), collect(), reduce() 본문

데이터분석/PySpark

[PySpark] 액션 - take(), collect(), reduce()

하연01 2023. 3. 10. 01:40

토마스 드라마브, 데니 리의 "PySpark 배우기"를 보고 배워나가는 과정을 기록한 글입니다 ♪


액션 

- 데이터셋에서 스케줄된 태스크 실행

 

※ 트랜스포메이션과 액션의 차이점

트랜스포메이션 

    * RDD를 변환하는 함수

    * 새로운 RDD를 생성하고 데이터의 처리 및 가공을 수행

    * 레코드 단위로 수행

→ 데이터셋을 변경하고 가공하기 위한 일련의 명령어

 

액션

    * 최종 결과를 반환하는 함수

    * 실제 계산 수행하며 RDD의 모든 요소 처리 

→ 액션 호출되면 저장된 명령어가 실제 수행되고 최종 결과값을 반환

 

 

 

.take(...) 함수

 

- 하나의 파티션에서 가장 위에 있는 n행을 리턴 

- collect() 보다 자주 쓰임

- 큰 데이터셋일 수록 중요

→ 이전 포스팅에서도 꾸준히 레코드를 확인할 때 take 함수를 사용했기 때문에 낯설진 않다. 

>>> data_first = data_from_file_conv.take(1)

 

* 데이터로부터 임의의 샘플을 얻고 싶다면, .takeSample() 함수를 사용하자

 

참고) .takeSample()

- 첫번째 파라미터 : 샘플링 재선택 허용여부

- 두번째 파라미터 : 리턴 데이터 개수 명시

- 세번째 : 랜덤 시드

 

ex) 재선택 하지 않고, 하나의 데이터만 추출한다. + 랜덤시드는 667

>>> data_take_sampled = data_from_file_conv.takeSample(False, 1, 667)

 

 

 

.collect(...) 함수 

- RDD의 모든 앨리먼트를 드라이버로 리턴

 

 

 

.reduce(...) 함수 

- 특정 함수를 사용해 RDD 개수 줄이기

- RDD의 총합을 구하기 위해 사용할 수 있음

>>> rdd1.map(lambda row: row[1]).reduce(lambda x, y: x+y)
15

- map() 트랜스포메이션을 이용해 RDD1의 값 리스트 생성

- 위 결과를 reduce() 함수로 처리

    → reduce() : 각 파티션에서 합계 함수(lambda) 수행 후 마지막 집계 수행되는 드라이버 노드에 합계 리턴

 

 

참고) .reduceByKey(...) 함수

- reduce()와 비슷하게 동작

- + 키 값 기반으로 리듀스

>>> data_key = sc.parallelize(
...     [('a', 4), ('b', 3), ('c', 2), ('a', 8), ('d', 2), ('b', 1), ('d', 3)], 4)

 

>>> data_key.reduceByKey(lambda x,y : x+y).collect()
[('b', 4), ('c', 2), ('a', 12), ('d', 5)]

→ 키 값을 기준으로 합계한 결과가 출력된다