본문 바로가기
알아두면 손해 없는 정보 저장소

Spark DataFrame의 이해

by anothel 2024. 3. 31.

인프런 인공지능 강의를 듣고 내용을 정리한다.

 

스파크 머신러닝 완벽 가이드 - Part 1 | 권 철민 - 인프런

권 철민 | 스파크(Spark) 머신러닝의 핵심 Framework에 대한 이해, 난이도 높은 실전 문제를 통한 SQL 기반의 데이터 가공, 업무 도메인 분석을 통한 데이터 분석과 최적화된 머신러닝 모델 구현 능력

www.inflearn.com

 

Pandas와 Spark DataFrame의 head() 및 print() 비교

head(N)은 Pandas와 Spark에서 반환값과 print() 적용 시의 출력이 다르다.

Pandas에서 선두 N 개 Record를 가지는 DataFrame을 반환하고, Spark에서 선두 N개 Row Object의 list를 반환한다. 이 반환값을 print() 적용 시 Pandas에서 DataFrame의 내용을 출력하고, Spark에서는 DataFrame의 schema만 출력한다.

Pandas에서 head(), print()

 

Spark에서 head(), print()

 

limit(N)은 Spark에서 DataFrame의 선두 N개 Record를 가지는 DataFrame을 반환하고 print() 적용 시 DataFrame의 schema만 출력한다. show()와 display()를 이용해 내용을 출력한다.

Spark에서 limit(N), print()

 

Spark에서 show()

 

Spark의 display()

 

Pandas DataFrame의 info()에 대응하는 Spark 메소드와 로직

Pandas의 info()는 컬럼명, data type과 not null 건수를 함께 출력하고, Spark는 info() 메소드 대신 printSchema()로 스키마(컬럼명, data type)만 출력한다. not null 건수를 위해서는 별도의 SQL성 쿼리 작성 필요하다.

Pandas의 info()

 

Spark의 printSchema()

 

# SQL의 count case when과 유사한 로직으로 null 값을 포함한 컬럼 확인하기 
from pyspark.sql.functions import count, isnan, when, col

titanic_sdf.select([count(when(isnan(c) | col(c).isNull(), c)).alias(c) for c in titanic_sdf.columns]).show()

 

Pandas와 Spark DataFrame의 describe() 비교

Pandas와 Spark Dataframe은 describe()를 통해 모든 컬럼 값들의 건수 / 평균 / 표준편차 / 최솟값 / 최댓값 등의 정보를 확인할 수 있고, 다만 Spark에서는 percentile 값을 만들지 않는다. Spark에서 Pandas와 다르게 describe() 시 숫자형 컬럼 뿐만 아니라 문자형 컬럼에 대해서도 건수 / 평균 / 표준편차 / 최솟값 / 최댓값을 조사한다.

Pandas의 describe()

 

Spark의 describe()

 

Pandas DataFrame의 shape에 대응하는 Spark의 로직

Pandas DataFrame의 shape은 row건수와 column 개수를 매우 빠르게 제공한다. Spark는 shape을 제공하지 않으며, column 개수는 spark DataFrame의 columns로 확인, row 건수는 count() 메소드(쿼리성)로 확인한다.

Pandas의 shape

 

Spark의 shape 대응

 

Spark DataFrame의 select()

Spark에서 select()는 SQL의 Select 절과 유사하게 한 개 이상의 컬럼들의 값을 DataFrame 형태로 반환한다. 한 개의 컬럼명, 또는 여러 개의 컬럼명을 인자로 입력할 수 있다. 

Pandas의 컬럼값(들) print()

 

Spark의 select() 컬럼값(들) show()

 

SQL과 유사하게 '*'를 사용한 모든 컬럼 선택

 

개별 컬럼명을 문자열 형태로 또는 DataFrame의 컬럼 속성으로 지정할 수 있다.

Pandas 개별 컬럼명을 문자열 형태로 지정

 

DataFrame의 컬럼 속성으로 지정 시에는 DataFrame.컬럼명, DataFrame[컬럼명], col(컬럼명) 으로 지정 가능하다.

Spark 개별 컬럼명을 문자열 형태로 지정

 

Spark 개별 컬럼명을 col(컬럼명) 형태로 지정

 

Spark DataFrame의 filter()

SQL의 where와 유사하게 DataFrame 내의 특정 조건을 만족하는 레코드를 DataFrame으로 반환한다.

where() 메소드는 filter()의 alias이며 SQL where와 직관적인 동일성을 간주하기 위해 생성

 

복합 조건 and는 & 를, or를 | 를 사용. 개별 조건은 ()로 감싸야 한다.

복합 조건의 사용

 

Spark DataFrame의 orderBy()

1개 이상의 컬럼순으로 정렬을 수행하여 DataFrame으로 반환한다. 정렬 컬럼은 문자열, 또는 컬럼 형태로 입력할 수 있으며, 정렬 컬럼이 여러 개일 경우 개별 컬럼을 인자로 넣거나 List 사용이 가능하다.

Pandas의 정렬, sort_values

오름차순, 내림차순 구분은 ascending=True/False로 구분한다.

 

다양한 컬럼명 지정 방법

 

1 개 이상의 컬럼에 대한 정렬을 처리할 수 있다.

 

정렬 컬럼이 여러 개일 때 개별 컬럼 별로 서로 다른 정렬 옵션을 적용할 경우 ascending=[True, False]와 같은 형태로 이용한다.

서로 다른 정렬 방법의 적용

 

orderBy()의 alias로 sort()를 제공한다

sort() 명령어

 

 

728x90