[Spark] SparkSQL

yoonseok choi·2022년 8월 22일
0

AWS

목록 보기
5/11
post-custom-banner

SparkSQL

  • 스파크 프로그래밍 내부에서 관계형 처리를 하기 위함
  • 스키마의 정보를 이용해 자동으로 최적화 하기 위함
  • 외부 테이터셋을 사용하기 쉽게 하기 위함

주요 API

  1. SQL
  2. DataFrame
  3. DataSet

DataFrame

  • 지연 실행
  • 분산 저장
  • Immutable
  • SQL 쿼리 실행 가능
  • CSV,JSON으로 read & write 가능

Spark Backend

  • Catalyst
    -Logical Plan을 Physical Plan으로 바꾸는 작업
    1. logical Plan : transformation 단계에 대한 추상화 ( 어떻게 작동하는지에 대한 )
    2. Physical Plan: logical plan이 cluster에서 어떻게 작동하는지 좀 더 구체화
  • Tungsten


spark session

Dataset & DataFrame을 사용하여 spark에 진입하는 진입점

df.createOrReplaceTempView()
- csv,parquet형식으로 되어있는 data를 pandas의 dataframe형태 말고
SQL문으로 데이터를 다루도록 하는 생성 메서드

sparksession.builder.getOrCreate()
- 기존 항목을 가져오거나 기존 항목 SparkSession이 없는 경우 이 빌더에 설정된 옵션을 기반으로 새 항목을 만듭니다.

pyspark.sparkcontext = sc 

참고 URL
https://spark.apache.org/docs/3.1.3/api/python/reference/pyspark.sql.html


Spark SQL 사용예제 코드

spark = SparkSession.builder.master("local").appName("sql-ex").getOrCreate()
#local에서 sql-ex라는 이름을 가진 sparkseesion을 생성.

stocks = [
    ('Google', 'GOOGL', 'USA', 2984, 'USD'), 
    ('Netflix', 'NFLX', 'USA', 645, 'USD'),
    ('Amazon', 'AMZN', 'USA', 3518, 'USD'),
    ('Tesla', 'TSLA', 'USA', 1222, 'USD'),
    ('Tencent', '0700', 'Hong Kong', 483, 'HKD'),
    ('Toyota', '7203', 'Japan', 2006, 'JPY'),
    ('Samsung', '005930', 'Korea', 70600, 'KRW'),
    ('Kakao', '035720', 'Korea', 125000, 'KRW'),
]
# 주식 데이터

stockSchema = ["name", "ticker", "country", "price", "currency"]
# 스키마를 설정 ( colunm's 열 개념과 같다 )

df = spark.createDataFrame(data=stocks, schema=stockSchema)
# SparkSQL문으로 다룰 수 있는 df를 생성한다.

df.show() 
# df를 출력하면 다음과 같다.
+-------+------+---------+------+--------+
|   name|ticker|  country| price|currency|
+-------+------+---------+------+--------+
| Google| GOOGL|      USA|  2984|     USD|
|Netflix|  NFLX|      USA|   645|     USD|
| Amazon|  AMZN|      USA|  3518|     USD|
|  Tesla|  TSLA|      USA|  1222|     USD|
|Tencent|  0700|Hong Kong|   483|     HKD|
| Toyota|  7203|    Japan|  2006|     JPY|
|Samsung|005930|    Korea| 70600|     KRW|
|  Kakao|035720|    Korea|125000|     KRW|
+-------+------+---------+------+--------+

spark.sql("select name, price from stocks where country = 'Korea'").show()
# where문을 사용하여 조건문을 사용 가능. -> country = korea인 stock데이터만 가져와라

spark.sql("select name, price from stocks where country like 'U%' and name not like '%e%'").show()
# like문을 사용하여 country가 u로 시작하고 not like문를 사용하여 회사 이름에 e가 포함되지 않는 조건문 생성


spark.sql("select name, price, currency from stocks \
where currency = 'USD' and \ price > (select price from stocks where name = 'Tesla')").show()
+------+-----+--------+
|  name|price|currency|
+------+-----+--------+
|Google| 2984|     USD|
|Amazon| 3518|     USD|
+------+-----+--------+
# \를 사용하여 조건을 중첩하여 사용할 수 있다.


spark.sql("select name, price from stocks order by price asc").show()
# order by price asc 를 사용하여 price를 asc 정렬 가능 ( desc도 가능 )
+-------+------+
|   name| price|
+-------+------+
|Tencent|   483|
|Netflix|   645|
|  Tesla|  1222|
| Toyota|  2006|
| Google|  2984|
| Amazon|  3518|
|Samsung| 70600|
|  Kakao|125000|
+-------+------+


earnings = [
    ('Google', 27.99, 'USD'), 
    ('Netflix', 2.56, 'USD'),
    ('Amazon', 6.12, 'USD'),
    ('Tesla', 1.86, 'USD'),
    ('Tencent', 11.01, 'HKD'),
    ('Toyota', 224.82, 'JPY'),
    ('Samsung', 1780., 'KRW'),
    ('Kakao', 705., 'KRW')
]
# 새로운 stock 데이터 정보

earningsSchema = StructType([
    StructField("name", StringType(), True),
    StructField("eps", FloatType(), True),
    StructField("currency", StringType(), True),
])

# 새로운 스키마 정의


earningsDF = spark.createDataFrame(data=earnings, schema=earningsSchema)
earningsDF.createOrReplaceTempView("earnings")
# 새로운 SparkSQL df 생성

spark.sql("select * from stocks join earnings on stocks.name = earnings.name").show()

# join earnings on stocks.name = earnings.name 
-> stocks.name = earnings.name 일때 두 df을 합친다.
-> 그 결과는 다음 출력문과 같다. -> name에 맞추어 데이터가 합쳐진 것을 확인 가능하다.

+-------+------+---------+------+--------+-------+------+--------+
|   name|ticker|  country| price|currency|   name|   eps|currency|
+-------+------+---------+------+--------+-------+------+--------+
| Amazon|  AMZN|      USA|  3518|     USD| Amazon|  6.12|     USD|
| Google| GOOGL|      USA|  2984|     USD| Google| 27.99|     USD|
|  Kakao|035720|    Korea|125000|     KRW|  Kakao| 705.0|     KRW|
|Netflix|  NFLX|      USA|   645|     USD|Netflix|  2.56|     USD|
|Samsung|005930|    Korea| 70600|     KRW|Samsung|1780.0|     KRW|
|Tencent|  0700|Hong Kong|   483|     HKD|Tencent| 11.01|     HKD|
|  Tesla|  TSLA|      USA|  1222|     USD|  Tesla|  1.86|     USD|
| Toyota|  7203|    Japan|  2006|     JPY| Toyota|224.82|     JPY|
+-------+------+---------+------+--------+-------+------+--------+
profile
Concilio et Labore ( 지혜와 노력으로 )
post-custom-banner

0개의 댓글