기술 노트

Spark와 머신러닝: 실무 활용 가이드 정리(작성중)

anothel 2024. 3. 31. 22:39

서론

 

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

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

www.inflearn.com

Spark는 대용량 데이터 처리와 머신러닝에 특화된 분산 컴퓨팅 프레임워크로, 데이터 엔지니어링과 머신러닝을 통합할 수 있는 강력한 도구다. 이번 블로그에서는 권 철민 강사님의 스파크 머신러닝 완벽 가이드 - Part 1 강의 내용을 바탕으로, Spark와 Pandas의 주요 기능 비교, 데이터 처리 방법, SQL 쿼리 활용법 등을 정리해 보려고 한다. Spark의 머신러닝 프레임워크와 SQL 기반 데이터 가공의 기초를 학습하며, 실무에서도 유용하게 사용할 수 있는 팁들을 소개한다.

1. Spark 기본 및 데이터 구조

이 섹션에서는 Spark와 Pandas의 DataFrame에서 자주 사용하는 기본 함수와 구조를 비교해 본다.

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

  • Pandas의 head(N)
    • 상위 N개의 데이터를 DataFrame 형태로 반환하며, print()를 사용하면 DataFrame 내용이 출력된다.
  • Spark의 head(N)
    • 상위 N개의 Row Object 리스트를 반환하며, print()로 출력할 경우 DataFrame의 스키마(schema)만 표시된다.

Pandas에서 head(), print()
Spark에서 head(), print()

Spark의 limit(N)과 show(), display() 메소드 비교

  • limit(N)
    • Spark에서는 limit(N)이 상위 N개의 Record를 포함한 DataFrame을 반환한다. 다만 print()로 출력할 경우 스키마(schema)만 출력되며, 실제 내용을 출력하려면 show() 또는 display()를 사용해야 한다.
# Spark에서 limit(N)을 이용해 내용 출력
spark_df.limit(N).show()  # show()와 display()로 실제 내용을 출력

Spark에서 limit(N), print()
Spark에서 show()
Spark의 display()

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

  • Pandas의 info()
    • 컬럼명, 데이터 타입, null이 아닌 건수까지 포함한 정보를 보여준다.
  • Spark의 printSchema()
    • 컬럼명과 데이터 타입 스키마만 출력하며, null 건수를 확인하려면 SQL 쿼리를 별도로 작성해야 한다.
# 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의 info()
Spark의 printSchema()

describe() 비교: Pandas vs Spark

  • Pandas describe()
    • 모든 컬럼의 건수, 평균, 표준편차, 최솟값, 최댓값 등을 계산해 보여준다.
  • Spark describe()
    • 숫자형뿐 아니라 문자형 컬럼도 포함하여 위 정보를 제공한다. 다만 percentiles는 제공되지 않는다.

Pandas의 describe()
Spark의 describe()

DataFrame의 shape 비교

  • Pandas shape
    • 빠르게 row와 column 수를 제공한다.
  • Spark shape 대응
    • DataFrame.columns로 컬럼 수를 확인하고, row 건수는 count() 메소드로 확인한다.

Pandas의 shape
Spark의 shape 대응


2. 데이터 선택과 필터링

Spark의 select(), filter(), orderBy()와 같은 기본 데이터 선택 및 정렬 방법을 다룬다.

Spark DataFrame의 select() 및 컬럼 지정

  • select()
    • SQL의 Select와 유사하게 원하는 컬럼의 값만 반환한다. '*'로 전체 컬럼 선택도 가능하다.
  • 컬럼 지정 방법
    • 컬럼명을 문자열, 속성(DataFrame.컬럼명), 또는 col(컬럼명) 형태로 지정할 수 있다.

Pandas의 컬럼값(들) print()
Spark의 select() 컬럼값(들) show()
SQL과 유사하게 '*'를 사용한 모든 컬럼 선택

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

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

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

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

Spark DataFrame의 filter()와 조건 설정

  • filter()와 where()
    • SQL의 where와 유사하며, 특정 조건을 만족하는 레코드를 반환한다. 복합 조건은 &(and), |(or)를 사용하며, 개별 조건은 ()로 감싸야 한다.

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

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

복합 조건의 사용

Spark DataFrame의 orderBy()와 정렬

  • orderBy()
    • 한 개 이상의 컬럼으로 정렬하며, 오름차순/내림차순 설정이 가능하다.
  • sort()
    • orderBy()의 alias로 사용 가능하며 여러 정렬 옵션을 적용할 수 있다.

Pandas의 정렬, sort_values

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

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

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

서로 다른 정렬 방법의 적용

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

sort() 명령어


3. 데이터 변형 및 집계

데이터 집계와 변형을 위한 다양한 함수 사용법을 설명한다.

Spark DataFrame의 그룹화 및 집계 방법

  • groupBy()
    • 특정 컬럼을 기준으로 그룹화하고 집계 함수와 함께 사용할 수 있다.
# 예시: 그룹화와 집계 함수
spark_df.groupBy("컬럼명").agg({"다른컬럼명": "sum"}).show()

Aggregation Functions(집계 함수) 활용법 

  • Spark는 sum(), avg(), min(), max() 등 다양한 집계 함수들을 제공해 데이터의 통계 정보를 쉽게 얻을 수 있다.

Window Functions(윈도우 함수)의 사용

  • 윈도우 함수를 사용하면 그룹 내에서 누적 계산을 할 수 있다. 이는 시간 흐름에 따른 누적 집계나 순위 계산에 유용하다.
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number

# 예시: 윈도우 함수로 순위 매기기
windowSpec = Window.partitionBy("컬럼명").orderBy("다른컬럼명")
spark_df.withColumn("순위", row_number().over(windowSpec)).show()

4. SQL을 활용한 데이터 처리

SQL 쿼리 문법을 사용해 DataFrame 데이터를 처리하는 방법을 다룬다.

Spark SQL 기본 문법과 활용

Spark SQL을 활용해 DataFrame을 SQL 쿼리 방식으로 처리할 수 있으며, 다양한 SQL 함수도 활용 가능하다.

SQL과 유사한 쿼리 문법으로 데이터 처리

SQL에서 사용하는 SELECT, WHERE, GROUP BY, ORDER BY 구문을 그대로 사용할 수 있어 SQL에 익숙한 사용자에게 유용하다.

등록된 DataFrame에서 SQL 쿼리 사용하기

SQL을 사용하기 위해 DataFrame을 Temporary View로 등록한 후 SQL 쿼리를 적용할 수 있다.

# DataFrame을 뷰로 등록하고 SQL 쿼리 실행
spark_df.createOrReplaceTempView("temp_view")
spark.sql("SELECT * FROM temp_view WHERE 컬럼명 = '조건'").show()

5. 머신러닝 기초와 실습

Spark의 MLlib을 사용하여 간단한 머신러닝 모델을 학습하고 평가하는 과정을 설명한다.

머신러닝 모델의 학습과 평가 방법

Spark MLlib은 분류, 회귀, 클러스터링 등 다양한 알고리즘을 제공하며, 모델을 학습하고 평가 지표를 사용해 성능을 검토할 수 있다.

Spark MLlib을 활용한 모델 생성 및 예측

기본적으로 DataFrame과 파이프라인을 사용해 데이터 전처리와 모델 학습 과정을 체계적으로 진행할 수 있다.

파이프라인(Pipeline) 구성과 파라미터 최적화

파이프라인을 통해 전처리 과정과 모델을 묶어서 쉽게 재사용 가능하며, 파라미터 튜닝도 GridSearch로 진행할 수 있다.


향후 업데이트 예정

아직 강의의 모든 내용을 다 듣지 못했기에, 추가적인 내용이 필요하다면 계속해서 업데이트해 나갈 예정이다.

728x90