핀아의 저장소 ( •̀ ω •́ )✧
02_02. SparkSQL 소개 및 기초 본문
1️⃣ SparkSQL
✅ 목적
- 스파크 프로그래밍 내부에서 관계형 처리를 하기 위해
- 스키마의 정보를 이용해 자동으로 최적화를 하기 위해
- 외부 데이터셋을 사용하기 쉽게 하기 위해
=> 스파크를 좀 더 간결하고, 쉽게 쓰고, 최적화도 자동으로 되기 위해
✅ 소개
- 스파크 위에 구현된 하나의 패키지
- 3개의 주요 API
- SQL
- DataFrame
- Datasets
- 2개의 백엔드 컴포넌트: 성능 최적화
- Catalyst - 쿼리 최적화 엔진
- Tungsten - 시리얼라이저, 용량을 최적화
2️⃣ DataFrame
- Spark Core에 RDD가 있다면 Spark SQL엔 DataFrame이 있다.
- DataFrame은 테이블 데이터셋이라고 보면 된다.
- 개념적으론 RDD에 스키마가 적용된 것으로 보면 된다.
- RDD에 적용된 Function이나 Partition의 개념도 적용 됐다고 봐야한다.
✅ SparkSession
- Spark Core에 SparkContext가 있다면 Spark SQL엔 SparkSession이 있다.
spark = SparkSession.builder.appName("test-app").getOrCreate()
- SparkSession이란 SparkContext와 비슷하게 새로운 Spark 어플리케이션을 만들수 있다.
- SparkSession은 Spark의 기초가 되는 function 들과 상호작용할 수 있게 해주는 접촉점 이며, DataFrame 과 Dataset API 를 사용하여 Spark 프로그래밍을 할 수 있도록 해준다.
✅ DataFrame만들기
- RDD에서 스키마를 정의한 다음 변형을 하거나 CSV, JSON등의 데이터를 받아오면 된다.
✅ RDD로부터 DataFrame만들기
- Schema를 자동으로 유추해서 DataFrame 만들기
- Schema를 사용자가 정의하기
# RDD
lines = sc.textFile("example.csv")
data = lines.map(lambda x: x.split(","))
preprocessed = data.map(lambda x: Row(name=x[0], price=int(x[1])))
- csv파일을 전처리 과정을 거친다.
# Infer
df = spark.createDataFrame(preprocessed)
- RDD로부터 가져오는 경우 전처리 데이터를 createDataFrame을 이용해 DataFreame을 자동으로 유추하여 생성한다.
# Specify
schema = StructType(
StructField("name", StringType(), True),
StructField("price", StringType(), True)
)
spark.createDataFrame(preprocessed, schema).show()
- 사용자가 DataFrame을 생성하는 경우, StructType을 정의하여 DataFrame을 생성한다.
✅ 파일로부터 DataFrame만들기
# JSON
dataFrame = spark.read.json('dataset/nyt2.json')
# TXT FILES
dataFrame_txt = spark.read.text('text_data.txt')
# CSV FILES
dataFrame_csv = spark.read.csv('csv_data.csv')
# PARQUET FILES
dataFrame_parquet = spark.read.load('parquet_data.parquet')
✅ createOrReplaceTempView
data.createOrReplaceTempView("mobility_data")
spark.sql("SELECT pickup_datatime FROM mobility_data LIMIT 5").show()
- DataFrame을 하나의 데이터베이스 테이블처럼 사용하려면 createOrReplaceTempView() 함수로 temporary view를 만들어줘야한다.
- 기존의 DB 쿼리에서는 FROM 값에 테이블이 들어가는 반면, SparkSQL은 DataFrame을 넣어서 쿼리를 사용할 수 있다.
✅ Spark에서 사용할 수 있는 SQL문
- Hive Query Language와 거의 동일
- SELECT
- FROM
- WHERE
- COUNT
- HAVING
- GROUP BY
- ORDER BY
- SORT BY
- DISTINCT
- JOIN
👌 위의 createOrReplaceTempView의 쿼리 결과
- DataFrame을 RDD로 변환해 사용할 수도 있다.
- rdd = df.rdd.map(tuple)
- 하지만 RDD를 덜 사용하는 쪽이 좋다.
✅ DataFrame의 이점
- MLLib이나 Spark Streaming 같은 다른 스파크 모듈들과 사용하기 편하다.
- 개발하기 편하다.
- 최적화도 알아서 된다.
3️⃣ Datasets
- Type이 있는 DataFrame
- PySpark에선 크게 신경쓰지 않아도 된다.
- 파이썬 자체가 type을 크게 타는 언어가 아니기 때문...
'Big Data > Engineering' 카테고리의 다른 글
02_04. DataFrame (0) | 2023.05.24 |
---|---|
02_03. SQL 기초 (0) | 2023.05.24 |
02_01. Structured vs Unstructured Data (0) | 2023.05.14 |
01_08. Shuffling & Partitioning (0) | 2023.05.14 |
01_07. Key-Value RDD Operations & Joins (0) | 2023.05.14 |
Comments