반전공자

[PySpark] 트랜스포메이션 - sample(), leftOuterJoin(), repartition() 본문

데이터분석/PySpark

[PySpark] 트랜스포메이션 - sample(), leftOuterJoin(), repartition()

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

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


.sample() 트랜스포메이션

- 데이터셋으로부터 임의로 추출된 샘플 리턴

- 첫번째 파라미터 : 중복 허용 여부 명시

- 두번째 파라미터 : 리턴할 데이터셋, 전체 데이터셋 간 크기 비율 명시

- 세번째 파라미터 : 임의 숫자를 생성하기 위한 시드 

 

* 원본 데이터의 10%에 해당하는 임의의 샘플 얻기

>>> fraction = 0.1
>>> data_sample = data_from_file_conv.sample(False, fraction, 666)

 

* 데이터셋 크기 검증

>>> print('Original dataset: {0}, sample: {1}'.format(data_from_file_conv.count(), data_sample.count()))
Original dataset: 2631171, sample: 263161

오호라 10% 맞군!

 

 

 

 

.leftOuterJoin(...) 트랜스포메이션

- 두 개의 RDD를 두 개의 데이터셋에서 찾은 값에 기반해 조인 후 두 개의 RDD가 매치되는 데이터에 대해 왼쪽 RDD에 오른쪽 RDD가 추가된 결과 리턴

- 데이터를 섞는 과정을 포함하므로 성능 저하될 수 있음

 

>>> rdd1 = sc.parallelize([('a', 1), ('b', 4), ('c', 10)])
>>> rdd2 = sc.parallelize([('a', 4), ('a', 1), ('b', '6'), ('d', 15)])
>>> rdd3 = rdd1.leftOuterJoin(rdd2)

 

a 1   a 4
b 4   a 1
c 10   b 6
      d 15

샘플 데이터 rdd1, rdd2를 표로 일단 그려봤다. 

왼쪽 rdd를 기준으로 오른쪽 rdd가 추가된 결과를 반환한다고 했으니,,, 

 

 

>>> rdd3.collect()
[('b', (4, '6')), ('c', (10, None)), ('a', (1, 4)), ('a', (1, 1))]
a 1 4
a 1 1
b 4 6
c 10 None

※ 오른쪽 RDD엔 c 값이 없기 때문에 결과 값엔 c의 짝궁에 None이 들어온다. 

 

참고) .join()

→ 교집합 키인 'a', 'b'의 값 리턴

>>> rdd4 = rdd1.join(rdd2)
>>> rdd4.collect()
[('b', (4, '6')), ('a', (1, 4)), ('a', (1, 1))]

 

참고) .intersection() 

교집합 앨리먼트를 리턴

>>> rdd5 = rdd1.intersection(rdd2)
>>> rdd5.collect()
[('a', 1)]

 

 

.repartition(...) 트랜스포메이션

- 데이터셋을 재파티션하면 데이터가 나눠지는 파티션의 개수가 바뀜

- 성능을 크게 저하!

 

>>> rdd1 = rdd1.repartition(4)
>>> len(rdd1.glom().collect())
4

→ 파티션 개수를 4개로 지정해 재파티션 수행 

 

glom() : 반환하는 리스트의 각 앨리먼트는 명시된 파티션에 존재하는 데이터셋의 모든 앨리먼트에 대한 리스트

▷ glom()이 생성하는 리스트는 파티션의 개수만큼의 앨리먼트를 갖고있음