본문 바로가기

Data/Data Analysis

[Pyspark] groupBy 개수 중복제거 countDistinct

반응형

데이터 분석을 할때 groupBy를 굉장히 많이 사용하는데. 이런 경험이 있었다. 예를들어서 df란 pyspark.DataFrame이 다음과 같이 있다면

date accountId timestamp another
2020-11-02 A 1 B
2020-11-02 A 2 C
2020-11-02 A 3 B
2020-11-02 A 4 D
2020-11-02 B 1 A
2020-11-02 B 2 C

 

여기서 날짜 그리고 accountId를 묶어서 another의 개수와 평균 timestamp를 계산하려고하면 이렇게 쓸수있을것이다

df.groupBy('date', 'accountId')\
	.agg(F.count(F.col('another')).alias('count'),
		F.avg(F.col('timestamp')).alias('mean))

출력은 다음과 같이 된다

date accountId mean count
2020-11-02 A 2.5 4
2020-11-02 B 1.5 2

여기서 이상한점이 있는데.  평균 시간은 제대로 계산이 되었지만. count의 부분에서 A는 B,C,D 밖에 없는데 4라는 숫자가 나왔다. 그렇다 count는 단순히 개수만 세어주는것이지 중복제거까지는 못해준다는것이다.

 

따라서, groupBy를 하기전에 중복제거를해야하는데. 우리는 mean의 값도 계산하고싶기때문에 굉장히 번거로워진다. 하지만 countDistinct함수를 사용하면 좀더 수월해진다.

df.groupBy('date', 'accountId')\
	.agg(F.countDistinct(F.col('another')).alias('count'),
		F.avg(F.col('timestamp')).alias('mean))

count대신 countDistinct 함수를 써주면 옳바르게 출력되는것을 볼수가있다

반응형