Ch2-과제. 파이스파크

2024. 3. 15. 22:56·프로젝트 단위 공부/[부스트코스] DataLit : 데이터 다루기

문제 1) CSV 파일을 읽고 파일에 쓰기

파이스파크로 똑같이 하고 차이를 관찰한다. 아마 여러 개의 파일이 출력되는 것을 확인할 수 있다. 무슨 일이 일어났는지 간단히 설명하고 어떻게 여러 개의 출력물을 하나의 파일로 합칠 수 있을지 간단히 답해보자.

Pyspark read/write

파이썬에서 스파크를 활용하기 위해서는 기본적으로 Session을 지정해주어야 한다.

from pyspark.sql.session import SparkSession

Sparksession을 확인하면 스파크의 버전과 AppName도 함께 출력된다. AppName은 함수를 통해 지정할 수 있다.

sc = SparkContext.getOrCreate()
spark = SparkSession(sc)

spark
# SparkSession - in-memory

# SparkContext

# Spark UI

# Version
# v3.5.1
# Master
# local[*]
# AppName
# pyspark-shell

기본적으로 데이터를 로드할 때, string type으로 읽는다. header-True 옵션을 통해 첫 번째 행을 열이름으로 인식하고 가져온다. 또한 inferSchema-True 옵션을 통해 해당 열이 숫자인지, 문자인지를 판단하여 Schema를 설정해준다.

df_pyspark = spark.read.option('header', 'true').option('inferSchema', 'true').csv('openpowerlifting.csv')

printSchema()를 통해 해당 변수의 Schema를 볼 수 있고, show를 통해 데이터를 확인 할 수 있다.

df_pyspark.printSchema()
# root
#  |-- MeetID: integer (nullable = true)
#  |-- Name: string (nullable = true)
#  |-- Sex: string (nullable = true)
#  |-- Equipment: string (nullable = true)
#  |-- Age: double (nullable = true)
#  |-- Division: string (nullable = true)
#  |-- BodyweightKg: double (nullable = true)
#  |-- WeightClassKg: string (nullable = true)
#  |-- Squat4Kg: double (nullable = true)
#  |-- BestSquatKg: double (nullable = true)
#  |-- Bench4Kg: double (nullable = true)
#  |-- BestBenchKg: double (nullable = true)
#  |-- Deadlift4Kg: double (nullable = true)
#  |-- BestDeadliftKg: double (nullable = true)
#  |-- TotalKg: double (nullable = true)
#  |-- Place: string (nullable = true)
#  |-- Wilks: double (nullable = true)
df_pyspark.show()
# +------+--------------------+---+----------+----+-----------+------------+-------------+--------+-----------+--------+-----------+-----------+--------------+-------+-----+------+
# |MeetID|                Name|Sex| Equipment| Age|   Division|BodyweightKg|WeightClassKg|Squat4Kg|BestSquatKg|Bench4Kg|BestBenchKg|Deadlift4Kg|BestDeadliftKg|TotalKg|Place| Wilks|
# +------+--------------------+---+----------+----+-----------+------------+-------------+--------+-----------+--------+-----------+-----------+--------------+-------+-----+------+
# |     0|    Angie Belk Terry|  F|     Wraps|47.0|  Mst 45-49|        59.6|           60|    NULL|      47.63|    NULL|      20.41|       NULL|         70.31| 138.35|    1|155.05|
# |     0|         Dawn Bogart|  F|Single-ply|42.0|  Mst 40-44|       58.51|           60|    NULL|     142.88|    NULL|      95.25|       NULL|        163.29| 401.42|    1|456.38|
# |     0|         Dawn Bogart|  F|Single-ply|42.0|Open Senior|       58.51|           60|    NULL|     142.88|    NULL|      95.25|       NULL|        163.29| 401.42|    1|456.38|
# |     0|         Dawn Bogart|  F|       Raw|42.0|Open Senior|       58.51|           60|    NULL|       NULL|    NULL|      95.25|       NULL|          NULL|  95.25|    1|108.29|
# |     0|        Destiny Dula|  F|       Raw|18.0| Teen 18-19|       63.68|         67.5|    NULL|       NULL|    NULL|      31.75|       NULL|         90.72| 122.47|    1|130.47|
# |     0|     Courtney Norris|  F|     Wraps|28.0|Open Senior|       62.41|         67.5|  -183.7|      170.1|    NULL|      77.11|       NULL|        145.15| 392.36|    1| 424.4|
# |     0|       Maureen Clary|  F|       Raw|60.0|  Mst 60-64|       67.31|         67.5|    NULL|     124.74|    NULL|      95.25|       NULL|        163.29| 383.28|    1|391.98|
# |     0|       Maureen Clary|  F|       Raw|60.0|Open Senior|       67.31|         67.5|    NULL|     124.74|    NULL|      95.25|       NULL|        163.29| 383.28|    1|391.98|
# |     0|Priscilla Sweat P...|  F|     Wraps|52.0|      50-54|       65.95|         67.5|    NULL|      120.2|    NULL|      54.43|       NULL|        108.86| 283.49|    1|294.25|
# |     0|Priscilla Sweat P...|  F|       Raw|52.0|     Senior|       65.95|         67.5|    NULL|       NULL|    NULL|       NULL|       NULL|        108.86| 108.86|    1|112.99|
# |     0|        Kayce Hoover|  F|     Wraps|24.0|     Junior|        65.5|         67.5|    NULL|     138.35|    NULL|      65.77|       NULL|        136.08|  340.2|    1|354.89|
# |     0|        Cindy Meeker|  F|     Wraps|56.0|  Mst 55-59|       71.21|           75|    NULL|      120.2|    NULL|      43.09|       NULL|        129.27| 292.56|    1|287.67|
# |     0|        Cindy Meeker|  F|     Wraps|56.0|Open Senior|       71.21|           75|    NULL|      120.2|    NULL|      43.09|       NULL|        129.27| 292.56|    1|287.67|
# |     0|Candice Pardue Ma...|  F|     Wraps|54.0|  Mst 50-54|       70.58|           75|    NULL|     102.06|    NULL|      74.84|       NULL|        106.59| 283.49|    1|280.44|
# |     0|      Danielle Ortiz|  F|       Raw|17.0| Teen 16-17|       69.31|           75|    NULL|      81.65|    NULL|       49.9|       NULL|        115.67| 247.22|    1|247.64|
# |     0|     Jessica Jenkins|  F| Multi-ply|32.0|Open Senior|       80.56|         82.5|    NULL|     229.06|    NULL|     161.03|       NULL|        210.92| 601.01|    1|547.81|
# |     0|    Jessica Wissmann|  F|     Wraps|25.0|Open Senior|       77.93|         82.5|    NULL|     142.88|    NULL|      68.04|       NULL|        136.08|  347.0|    1| 322.3|
# |     0|           Emma Love|  F|       Raw|18.0| Teen 18-19|       77.93|         82.5|    NULL|      86.18|    NULL|      52.16|       NULL|         83.91| 222.25|    1|206.43|
# |     0|        Kelly Benson|  F|       Raw|22.0|Open Junior|       88.72|           90|    NULL|     102.06|    NULL|      77.11|       NULL|         120.2| 299.37|    1|260.25|
# |     0|      Cathy Cranford|  F|       Raw|56.0|  Mst 55-59|        83.1|           90|    NULL|      86.18|    NULL|      38.56|       NULL|        102.06|  226.8|    1|203.35|
# +------+--------------------+---+----------+----+-----------+------------+-------------+--------+-----------+--------+-----------+-----------+--------------+-------+-----+------+
# only showing top 20 rows

데이터를 Partition 별로 나눠 처리하기 때문에 'openpower' 폴더 내에 여러 압축된 형태의 분산된 파일들이 저장된다. 이는 ./openpower/* 로 다시 읽을 수 있다. 강제로 하나의 파일로 생성이 가능하지만, Overflow가 발생할 수 있다. 따라서 용량이 큰 경우에는 파일을 합치는 task를 생성해 따로 처리하는 것이 좋다.

# spark.read.csv('openpower/*')로 다시 읽을 수 있다.
df_pyspark.write.option("header", "true").csv("openpower")

# repartition 메소드를 활용하면 강제로 하나의 파일로 생성 가능하다.
df_pyspark.repartition(1).write.option("header", "true").csv("openpower2")

문제 2) Yelp의 리뷰 데이터 셋 활용

Yelp의 리뷰 데이터 셋을 내려받아 판다스와 스파크로 'user.json'을 읽어보자.

X

다운로드 시간이 너무 오래 걸려 스킵한다.

문제 3) 위의 데이터 셋의 'photo.json' 활용

레이블 영역에 있는 고유한 값의 개수를 세는데, 판다스와 스파크의 걸린 시간을 비교한다.

openpowerlifting.csv 파일로 대체

해당 데이터는 28M밖에 되지 않기 때문에 판다스와 파이스파크의 시간을 비교하면 판다스가 훨씬 빠른 것을 알 수 있다. 데이터가 TB 수준까지 커지면 파이스파크의 속도가 더 빠르지만, 로컬 환경에서 진행하기엔 무리가 있다.

import time
import pandas as pd
df_pyspark = spark.read.option('header', 'true').option('inferSchema', 'true').csv('openpowerlifting.csv')

start = time.time()

df_pyspark.count()

end = time.time()
print(f"{end - start:.5f} sec")
# 0.64350 sec
df_pandas = pd.read_csv('openpowerlifting.csv')

start = time.time()

len(df_pandas)

end = time.time()
print(f"{end - start:.5f} sec")
# 0.00010 sec

참고 링크

DataLit : 데이터 다루기

https://www.boostcourse.org/ds103/joinLectures/84465

 

Yelp 리뷰 데이터 셋

https://www.yelp.com/dataset

 

kaggle data : powerlifting-database

https://www.kaggle.com/datasets/dansbecker/powerlifting-database

 

Pyspark 읽기 및 저장

https://givitallugot.github.io/articles/2021-12/Spark-pyspark1

 

Pyspark csv 파일 불러오기

https://ok-lab.tistory.com/109

 

Spark 간단하게 하나의 파일로 Write 하는 법

https://helloino.tistory.com/192

 

[python] 파이썬 시간 측정, 프로그램 시간 측정 방법

https://blockdmask.tistory.com/549

 

전체 코드 - Colab

https://colab.research.google.com/drive/1I5HqAS_CeOfZYoCNFeM97tlTPlwIxv0I#scrollTo=rDSqMF9FGXWt

'프로젝트 단위 공부 > [부스트코스] DataLit : 데이터 다루기' 카테고리의 다른 글

Ch3-3. 데이터 스토리텔링 파트 1  (0) 2024.03.17
Ch3-1. 데이터 사이언스 발표 가이드  (0) 2024.03.16
Ch2-4. 쿠버네티스  (0) 2024.02.24
Ch2-3. PySpark  (0) 2023.08.01
Ch2-1. 하둡  (0) 2023.07.31
'프로젝트 단위 공부/[부스트코스] DataLit : 데이터 다루기' 카테고리의 다른 글
  • Ch3-3. 데이터 스토리텔링 파트 1
  • Ch3-1. 데이터 사이언스 발표 가이드
  • Ch2-4. 쿠버네티스
  • Ch2-3. PySpark
기억에 남는 블로그 닉네임
기억에 남는 블로그 닉네임
  • 기억에 남는 블로그 닉네임
    얕게, 깊게
    기억에 남는 블로그 닉네임
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
    • 분류 전체보기
      • Data Engineering
        • Airflow
        • 빅데이터
        • 자동화
        • 기타
      • Infra
        • AWS
        • Terraform
        • [인프라 구축기] Terraform 활용 AWS ..
      • CS
        • 자료구조
        • 알고리즘
        • 네트워크
        • 데이터베이스
        • 이것이 취업을 위한 코딩 테스트다 with 파이썬
      • Python
      • Web
      • Git
      • 기타
        • 취업 & 진로
        • 회고록
        • 기타
      • 프로젝트 단위 공부
        • [부스트코스] DataLit : 데이터 다루기
        • [개인 프로젝트] 공모전 크롤링
        • [개인 프로젝트] FC Online 공식 경기 분..
        • 프로젝트 개선 방안
      • [프로그래머스] 데이터 엔지니어링 데브코스 3기
        • TIL(Today I Learn)
        • 숙제
        • 기타
      • 알고리즘 연습
        • 프로그래머스
        • 백준
  • 링크

    • 깃허브
    • 링크드인
  • 인기 글

  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
기억에 남는 블로그 닉네임
Ch2-과제. 파이스파크
상단으로

티스토리툴바