문제 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 리뷰 데이터 셋
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 |