요약
- pandas DataFrame은 그룹화 된 DataFrameGroupBy 객체 반환
- spark DataFrame도 그룹화 된 GroupedData 객체 반환 후 aggregation 메소드 적용.
- pandas DataFrameGroupBy와 spark GroupedData 모두 객체에 agg() 메소드를 이용하여 서로 다른 컬럼에 서로 다른 aggregation 함수 적용 가능
- spark groupBy()는 pandas groupby()의 특징과 SQL의 특징을 함께 가짐.
# 기본 사용법
titanic_sdf.groupBy('Pclass').count().show()
# 정렬
titanic_sdf.groupBy('Pclass').count().orderBy('count', ascending=False).show()
# 메서드 내부에 인자로 컬럼명 입력
titanic_sdf.groupBy('Pclass').max('Age').show()
# 여러 컬럼에 적용
titanic_sdf.groupBy('Pclass', 'Sex').max('Age').show()
titanic_sdf.groupBy(['Pclass', 'Sex']).max('Age').show()
# 호출
from pyspark.sql.functions import max, avg, sum, min
# 여러 컬럼에 서로 다른 aggregation 적용
titanic_sdf.groupBy('Pclass').agg(
max('Age'), min('Age'), sum('Age'), avg('Age')
).show()
# 별명 (alias) 부여
titanic_sdf.groupBy('Pclass').agg(
max(col('Age')).alias('max_age'), min('Age').alias('min_age'), \
sum('Age').alias('sum_age'), avg('Age').alias('avg_age') \
).show()
# ** filter() 사용
titanic_sdf.groupBy('Pclass').agg(
max(col('Age')).alias('max_age'), min('Age').alias('min_age') , \
sum('Age').alias('sum_age'), avg('Age').alias('avg_age') \
).filter(col('max_age') > 70).show()
select max_age, min_age, sum_avg, avg_age
from (
select max(age) as max_age
, min(age) as min_age
, sum(age) as sum_age
, avg(age) as avg_age
from titanic_sdf
group by pclass
) where max_age > 70