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 = 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|
+-------+------+---------+------+--------+-------+------+--------+