반응형
데이터 분석을 할때 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 함수를 써주면 옳바르게 출력되는것을 볼수가있다
반응형
'Data > Data Analysis' 카테고리의 다른 글
[Pyspark] pyspark 파일 저장 coalesce함수가 시간이 오래걸릴때 (0) | 2020.11.24 |
---|---|
[Pyspark ] pivot 함수 사용방법 (0) | 2020.11.18 |
[Pandas] apply, map, groupby등 모르는거 정리 (0) | 2020.11.04 |
[SQL] RANK(), ROW_NUMBER(), DENSE_RANK() (0) | 2020.08.05 |
[SQL] ARRAY_CONTAINS 함수 (0) | 2020.07.20 |