[Spark] Spark 데이터프레임 주요 메서드 - (1) select, filter

baekdata·2022년 3월 1일
0

Spark

목록 보기
4/8

1. Select 메서드

요약

  • select() 메소드는 SQL의 Select 절과 유사하게 한개 이상의 컬럼들의 값을 DataFrame형태로 반환
  • 한개의 컬럼명, 또는 여러개의 컬럼명을 인자로 입력 가능
  • 개별 컬럼명을 문자열 형태로 또는 DataFrame의 컬럼 속성으로 지정 가능
  • DataFrame의 컬럼 속성으로 지정시에는 DataFrame.컬럼명, DataFrame[컬럼명], col(컬럼명) 으로 지정 가능

a. select() 사용

# select() 메소드는 DataFrame을 반환. Name 컬럼을 가지는 DataFrame을 반환. 
data_sdf.select('Name').show() # select name from data_sdf;

# 여러개의 컬럼명을 select시에도 개별 컬럼명을 인자로 넣어줌. pandas와 다르게 list 미사용
data_sdf.select('Name', 'Year').show() # select Name, Year from data_sdf

# 모든 컬럼을 선택시 SQL과 유사하게 '*' 사용 가능. 
data_sdf.select('*').show() # select * from data_sdf

b. list를 unpack하여 select

select_columns = data_sdf.columns
# * list 는 list내부의 원소를 unpack함. 
print('select_columns:', select_columns, *select_columns)

data_sdf.select(*select_columns).show()
#버전 upgrade가 되면서 select 절에 list를 입력해도 여러개의 컬럼을 반환 가능. 
#하지만 원칙적으로 개별 컬럼들을 인자로 입력하는 것이 바람직. 
data_sdf.select(select_columns).show()

select_columns.remove('Name')
data_sdf.select(*select_columns).show()
  • *list 를 사용하면, list 내부 원소를 unpack (ex. name year gender)

c. 컬럼 속성으로 지정하여 select의 인자로 사용하는 방법 3가지

  • 컬럼 속성으로 지정하여 select 의 인자로 사용 가능.
  • pandas DataFrame의 ['column']는 컬럼값을 포함한 array를 지칭함
    - data_pdf['컬럼']은 해당 컬럼의 로우까지 포함한 array 형태 출력
  • spark DataFrame의 ['column']는 컬럼 자체를 지정함.
    - data_sdf['컬럼']은 해당 컬럼 자체만을 지칭

## 방법 1. data_sdf.컬럼명 지정
data_sdf.select(data_sdf.Name, data_sdf.Year).show()

## 방법 2. data_sdf['컬럼명'] 지정
data_sdf.select(data_sdf['Name'], data_sdf['Year']).show()

## 방법 3. pyspark.sql.functions의 col 함수 사용하여 지정
from pyspark.sql.functions import col
data_sdf.select(col('Name'), col('Year')).show()

d. select() 내에서 컬럼 가공

  • 예시의 upper()와 같이 select 내에서 다양한 함수 지정하여 컬럼 가공 가능
  • .alias()로 sql에서의 as와 같이 별명 지정 가능
from pyspark.sql.functions import upper, lower, col

# Select A.*, upper(Name) from data_view A
data_sdf.select("*", upper(col('Name'))).show() 

# Select upper(Name) as Cap_Name from data_view
data_sdf.select(upper(col('Name')).alias('Cap_Name')).show() 

2. filter 메서드

요약

  • filter()는 SQL의 where와 유사하게 DataFrame내의 특정 조건을 만족하는 레코드를 DataFrame으로 반환
  • filter()내의 조건 컬럼은 컬럼 속성으로 지정 가능. 조건문 자체는 SQL 과 유사한 문자열로 지정 할 수 있음 (조건 컬럼은 문자열 지정이 안됨.)
  • where() 메소드는 filter()의 alias로 동일한 역할을 함. SQL where와 직관적인 동일성을 간주하기 위해 생성
  • 복합 조건 and는 & 를, or를 | 를 사용. 개별 조건은 ()로 감싸야 함

a. filter() 사용

  • filter() 는 SQL의 where과 유사하며, alias인 where로도 동일하게 사용 가능
  • 조건 컬럼은 컬럼 혹은 문자열로 사용 가능
## 방법1.
data_sdf.filter(col('Name') == 'Baek').show()

## 방법2. 
data_sdf.filter(data_sdf['Name'] == 'Baek').show()

## 방법3.
data_sdf.filter(data_sdf.Name == 'Baek').show()

## alias인 where
data_sdf.where(data_sdf.Name == 'Baek').show()

## 조건 컬럼을 문자열로 지정할 수 없으므로 아래는 오류 발생
data_sdf.filter('Name' == 'Chulmin').show()

b. string 형태의 조건문 사용

  • ""로 감싸서 String 형태의 조건문으로 사용 가능
  • 조건문의 내부 문자열은 ''로 감싸야 함
# select * from data_sdf where Name = 'Baek'
data_sdf.filter("Name == 'Baek'").show() 

c. 복합 조건문

  • 복합 조건 and는 & 를, or를 | 를 사용. 개별 조건은 ()로 감싸야 함
# select * from data_sdf where Gender = 'Male' and Year > 2011
data_sdf.filter( (data_sdf['Gender'] == 'Male') & (col('Year') > 2011) ).show() 

# select * from data_sdf where Gender = 'Male' or Year < 2011
data_sdf.filter( (data_sdf['Gender'] == 'Male') | (col('Year') < 2011) ).show() 

d. 문자열 컬럼 Like 사용

  • 컬럼 지정 후 .like 사용하거나 string 형태로 지정
# select * from data_sdf where Name like 'Baek%'
data_sdf.filter(col('Name').like('Baek%')).show() 

print('SQL의 Like 조건문을 string으로 filter() 수행. ')
data_sdf.filter(" Name like 'Baek%' ").show()
data_sdf.filter(" Name like 'B%' ").show() 
data_sdf.filter(" Name like '%ae%' ").show() 
data_sdf.filter(" upper(Name) like '%M%' ").show() 
  • 내부에 함수 지정
# select * from data_sdf where upper(Name) like '%B%'

from pyspark.sql.functions import upper
data_sdf.filter(upper(data_sdf['Name']).like('%B%')).show() 

# filtering 후에 특정 컬럼으로만 DataFrame 생성하려면 select() 적용. 
# select Year, Gender from data_sdf where upper(Name) like '%B%'
data_sdf.filter(upper(data_sdf['Name']).like('%B%')).select('Year', 'Gender').show()
profile
글쓰는 데이터 분석가

0개의 댓글