1 |
|
- 만약 위 코드에서 미국의 2000불 이상의 주식만 가져오기 위한 방법은 3가지로 생각해볼 수 있다.
- Inner Join
- Filter by Coutry
- Filter by Currency
1 |
|
- 두 가지의 경우 같은 결과를 낳지만 퍼포먼스 자체는 두 번째 케이스가 좋다.
- 연산에 대하여 일일이 신경쓰기란 까다롭다.
- 네트워크 연산 성능에 대하여 만약 데이터가 구조화되어 있다면 자동으로 최적화가 가능하다.
- 구조화된 데이터란 정형, 비정형, 반정형데이터를 뜻한다.
정형(Structured), 비정형(Unstructured), 반정형(Semi structured)
- 정형: 행과 열이 있고 데이터 타입이 스키마인 데이터이다.
- 데이터 베이스
- 비정형: 자유 형식으로 정리가 되지 않은 파일이다.
- 로그 파일
- 이미지
- 반정형: 행과 열이 있는 데이터이다.
- CSV
- JSON
- XML
정형 데이터와 RDD
- RDD에서는 데이터의 구조를 모르기 때문에 데이터를 다루는 것을 개발자에게 의존할 수 밖에 없다.
- map, flatMap, filter 등을 통해 유저가 만든 함수를 수행한다.
- 하지만 정형 데이터에서는 데이터의 구조를 이미 알고 있으므로 어떤 테스크를 수행할 것인지 정의만 하면 된다.
- 최적화도 자동으로 진행된다.
Spark SQL
- Spark SQL은 구조화된 데이터를 다룰 수 있게 해준다.
- 유저가 일일이 함수를 정의하는 일 없이 작업을 수행할 수 있고 자동으로 연산이 최적화된다.
스파크(Spark) SQL
목적
- 스파크 프로그래밍 내부에서 관계형 처리를 할 수 있다.
- 스키마 정보를 이용해 자동으로 최적화를 할 수 있다.
- 외부 데이터셋을 쉽게 사용할 수 있다.
소개
- 스파크 위에 구현된 하나의 패키지이다.
- 3개의 주요 API가 존재한다.
- SQL
- DataFrame
- Datasets
- 2개의 백엔드 컴포넌트로 최적화를 진행한다.
- Catalyst: 쿼리 최적화 엔진
- Tungsten: 시리얼라이저(용량)
데이터 프레임(DataFrame)
- 스파크 코어(Core)에 RDD가 있다면 스파크 SQL에는 데이터 프레임이 있다.
- 데이터 프레임은 테이블 데이터셋이다.
- 개념적으로는 RDD에 스키마가 적용된 것이라 볼 수 있다.
데이터 프레임 생성
- RDD에서 스키마를 정의한 다음 변형 하는 방법과 CSV, JSON 등의 데이터를 받아오는 방법이 있다.
RDD로 데이터 프레임 생성
- 스키마를 자동으로 유추하여 데이터 프레임을 만들거나, 스키마를 사용자가 정의하는 방법이 있다.
1 |
|
- 두 번째 블록은 자동으로 유추하는 것이고, 세번째는 사용자가 정의하여 데이터 프레임을 만드는 방법이다.
파일로부터 데이터 프레임 생성
1 |
|
createOrReplaceTempView
- 데이터 프레임을 하나의 데이터 베이스 테이블 처럼 사용하려면
createOrReplaceTempView()
함수로 temporary view를 만들어줘야한다.
1 |
|
- 닉네임을 지정하면 SQL문처럼 사용할 수 있다.
스파크 세션(SparkSession)
- 스파크 코어에 스파크 컨텍스트가 있었다면 스파크 SQL엔 스파크 세션이 있다.
- 파이썬에서 스파크 SQL을 사용하기 위한 방법이며 스파크 세션으로 불러오는 데이터는 데이터 프레임이다.
1 |
|
- 위와 같은 코드로 스파크 세션을 만들어 줄 것이다.
- SQL문 뿐만 아니라 함수를 사용해서도 가능하다.
- 데이터 프레임을 RDD로 변환하여 사용할 수도 있지만(
rdd = df.rdd.map(tuple)
), RDD를 덜 사용하는 쪽이 좋다.
스파크에서 사용할 수 있는 SQL문
- 하이브 쿼리 언어(Hive Query Language)와 거의 동일하다.
- Select
- From
- Where
- Count
- Having
- Group By
- Order By
- Sort By
- Distinct
- Join
데이터 프레임의 이점
- 위에서 RDD를 덜 사용하는 편이 좋다고 했는데, 그 이유는 MLlib이나 스파크 스트리밍(Spark Streaming)과 같은 다른 스파크 모듈과 사용하기엔 데이터 프레임이 좋기 때문이다.
- 개발하기에도 편하고 최적화도 알아서 된다.
데이터셋(Datasets)
- 타입이 있는 데이터프레임이며 파이스파크에선 크게 신경쓰지 않아도 된다.
파이썬 튜토리얼
1 |
|
데이터 프레임(DataFrame)
- 데이터 프레임은 관계형 데이터셋(RDD + Relation)이다.
- RDD가 함수형 API를 가졌다면 데이터 프레임은 선언형 API이다.
- 스키마를 가졌기 때문에 자동으로 최적화가 가능하다.
- 타입이 없다.(데이터 프레임 내부적으로 타입을 관제하지 않는다.)
데이터 프레임의 특징
- 데이터 프레임은 RDD의 확장판이다.
- RDD와 같이 지연 실행(Lazy Execution)된다.
- 분산 저장된다.
- 불변(immutabel) 데이터이다.
- 열(row) 객체가 있다.
- SQL 쿼리를 직접 바로 실행할 수 있다.
- 스키마를 가질 수 있고, 이를 통해 성능을 더욱 최적화 할 수 있다.
- CSV, JSON, Hive 등으로 읽어오거나 변환이 가능하다.
데이터 프레임의 스키마 확인
dtypes
- 내부 스키마를 볼 수 있다.
1 |
|
show()
- 테이블 형태로 데이터를 출력하며 첫 20개의 열만 전시한다.
- 디버깅할 때 유용하게 쓰인다.
1 |
|
printSchema()
- 스키마를 트리 형태로 볼 수 있다.
- 중첩된 스키마라면 이 방법이 편하다.
1 |
|
복잡한 데이터 타입
- ArrayType: 변수 타입
- MapType: 파이썬의 딕셔너리와 같은 형태
- StructType: 오브젝트
데이터 프레임의 작업
- SQL과 비슷한 작업이 가능하다.
- Select
- Where
- Limit
- OrderBy
- GroupBy
- Join
Select
- 사용자가 원하는 컬럼이나 데이터를 추출하는데 사용한다.
1 |
|
Agg
- Aggregate의 약자로, 그룹핑 후 데이터를 하나로 합치는 작업이다.
1 |
|
GropBy
- 사용자가 지정한 컬럼을 기준으로 데이터를 그룹핑하는 작업이다.
1 |
|
Join
- 다른 데이터 프레임과 사용자가 지정한 컬럼을 기준으로 합치는 작업이다.
1 |
|
데이터 프레임 조작 예제
1 |
|