[Spark] Spark 데이터프레임 주요 메서드 - (3) groupBy

baekdata·2022년 3월 30일
0

Spark

목록 보기
6/8

groupBy 메서드

요약

  • pandas DataFrame은 그룹화 된 DataFrameGroupBy 객체 반환
  • spark DataFrame도 그룹화 된 GroupedData 객체 반환 후 aggregation 메소드 적용.
  • pandas DataFrameGroupBy와 spark GroupedData 모두 객체에 agg() 메소드를 이용하여 서로 다른 컬럼에 서로 다른 aggregation 함수 적용 가능
  • spark groupBy()는 pandas groupby()의 특징과 SQL의 특징을 함께 가짐.

a. 기본 용법

  • groupBy 내에 컬럼명 사용 후 이후 count, min, max, avg, sum 등 사용
  • 정렬은 GroupedData에 orderBy 메서드 사용하여 정렬
  • aggregation 메서드 내부에 인자로 컬럼명 입력 (max('age'))
  • 여러 컬럼으로 Group By 할 때에는, 개별 컬럼명 입력 혹은 list 형태로 입력
# 기본 사용법
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()

b. 주의 사항

  • count()가 아닌 다른 aggregation 메서드 적용시 판다스와 유사하게 전체 컬럼에 대해 agg 적용
  • GroupedData에서 aggregation 메소드 호출 시 오직 문자열 컬럼명만 가능

c. agg() 메소드

  • agg() 이용하면 개별 컬럼에 서로 다른 aggregation 메서드를 보다 쉽게 적용 가능
  • 개별 aggregation 함수 결과 컬럼에 별도의 컬럼명을 alias('새로운 컬럼명')로 부여 가능
  • 결과에 filter()를 적용하여 SQL의 having과 같은 기능 수행 가능
# 호출 
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()
  • ** filter() 사용의 결과는 SQL로 아래와 같이 표현 가능
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
profile
글쓰는 데이터 분석가

0개의 댓글