서론
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)만 표시된다.
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()로 실제 내용을 출력
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()
describe() 비교: Pandas vs Spark
- Pandas describe()
- 모든 컬럼의 건수, 평균, 표준편차, 최솟값, 최댓값 등을 계산해 보여준다.
- Spark describe()
- 숫자형뿐 아니라 문자형 컬럼도 포함하여 위 정보를 제공한다. 다만 percentiles는 제공되지 않는다.
DataFrame의 shape 비교
- Pandas shape
- 빠르게 row와 column 수를 제공한다.
- Spark shape 대응
- DataFrame.columns로 컬럼 수를 확인하고, row 건수는 count() 메소드로 확인한다.
2. 데이터 선택과 필터링
Spark의 select(), filter(), orderBy()와 같은 기본 데이터 선택 및 정렬 방법을 다룬다.
Spark DataFrame의 select() 및 컬럼 지정
- select()
- SQL의 Select와 유사하게 원하는 컬럼의 값만 반환한다. '*'로 전체 컬럼 선택도 가능하다.
- 컬럼 지정 방법
- 컬럼명을 문자열, 속성(DataFrame.컬럼명), 또는 col(컬럼명) 형태로 지정할 수 있다.
개별 컬럼명을 문자열 형태로 또는 DataFrame의 컬럼 속성으로 지정할 수 있다.
DataFrame의 컬럼 속성으로 지정 시에는 DataFrame.컬럼명, DataFrame[컬럼명], col(컬럼명) 으로 지정 가능하다.
Spark DataFrame의 filter()와 조건 설정
- filter()와 where()
- SQL의 where와 유사하며, 특정 조건을 만족하는 레코드를 반환한다. 복합 조건은 &(and), |(or)를 사용하며, 개별 조건은 ()로 감싸야 한다.
복합 조건 and는 & 를, or를 | 를 사용. 개별 조건은 ()로 감싸야 한다.
Spark DataFrame의 orderBy()와 정렬
- orderBy()
- 한 개 이상의 컬럼으로 정렬하며, 오름차순/내림차순 설정이 가능하다.
- sort()
- orderBy()의 alias로 사용 가능하며 여러 정렬 옵션을 적용할 수 있다.
오름차순, 내림차순 구분은 ascending=True/False로 구분한다.
정렬 컬럼이 여러 개일 때 개별 컬럼 별로 서로 다른 정렬 옵션을 적용할 경우 ascending=[True, False]와 같은 형태로 이용한다.
orderBy()의 alias로 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로 진행할 수 있다.
향후 업데이트 예정
아직 강의의 모든 내용을 다 듣지 못했기에, 추가적인 내용이 필요하다면 계속해서 업데이트해 나갈 예정이다.
'기술 노트' 카테고리의 다른 글
CHM(Compiled HTML Help, 윈도우 도움말 파일) (0) | 2024.10.24 |
---|---|
MacOS 개발 첫 발: 환경 설정부터 코드 호출까지 (0) | 2022.03.18 |
Unix와 Linux: 다양한 OS 환경에서의 빌드와 자동화 경험 (0) | 2022.03.17 |
Solaris 10 이하에서 .tar.gz 파일을 여는 방법 (0) | 2022.03.16 |
AIX에서의 XL gcc 컴파일러: 설치/삭제 가이드 (2) | 2022.03.15 |