핀아의 저장소 ( •̀ ω •́ )✧

02_02. SparkSQL 소개 및 기초 본문

Big Data/Engineering

02_02. SparkSQL 소개 및 기초

_핀아_ 2023. 5. 14. 19:32

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