'Spark The Definitive Guide' 10장 - SQL 너마저
2021년 2월 23일#spark
_ _ _
CHAPTER 10 스파크 SQL
스파크 SQL은 스파크에서 가장 중요하고 강력한 기능 중 하나.
스파크 SQL은 DataFrame, Dataset API에 통합되어 있다
(=> 즉 SQL, DataFrame 기능 모두 사용 가능 & 동일한 실행 코드로 컴파일)
- DB에 생성된 뷰(view)나 테이블에 SQL쿼리 실행 가능
- 시스템 함수 사용, 사용자 정의 함수 정의 가능
- 쿼리 실행 계획 분석 가능 (=> 워크로드 최적화)
10.1 SQL이란
- SQL (Structured Query Launguage, 구조적 질의 언어)
- 데이터에 대한 관계형 연산을 표한하기 위한 도메인 특화 언어
- 모든 관계형 데이터베이스에서 사용
- NoSQL 데이터베이스에서도 쉽게 사용 가능한 변형된 자체 SQL 제공
없어질거다~ 진다~ 해도 없어질 수가 없는 데이터 처리 언어 계의 짱짱맨
- 스파크 SQL
- ANSI SQL:2003 의 일부를 구현
- => 대부분의 SQL DB에서 채택하고 있는 표준 (so 유명 벤치마크도 통과)
10.2 빅데이터와 SQL: 아파치 하이브
- 스파크 등장 전
- 사실상 빅데이터 SQL 접근 계층의 표준 => Hive (made by Facebook)
- 하둡을 다양한 사업군으로 진출하는데 도움
- 스파크는 RDD를 이용하는 범용 처리 엔진으로 시작했지만, 현재는 많은 이용자가
스파크 SQL 사용 중
10.3 빅데이터와 SQL: 스파크 SQL
- Hive 지원하는 상위 호환 기능 지원
- 스파크 2.0 버전. 자체 개발된 SQL 파서 포함
- => ANSI-SQL, HiveQL 모두 지원
- 스파크 SQL은 DataFrame과의 뛰어난 호환성
- 다양한 기업에서 강력한 기능으로 자리매김할 수 있는 이유
- ex. Facebook 의 스파크 워크로드 (2016) (블로그 내용
p.280-281
)
- 스파크 SQL의 강력함을 만드는 핵심 요인
- SQL 분석가) Thrift Server 나 SQL 인터페이스에 접속해, 스파크 연산 능력 활용 가능
- 데이터 엔지니어 & 과학자) 전체 데이터 처리 파이프라인에 스파크 SQL 사용 가능
- 스파크 SQL (통합형 API) 으로 인해 가능해진 전체 과정
- SQL 로 데이터 조회
- => DataFrame으로 변환
- => 스파크 MLlib (대규모 머신러닝 알고리즘) 수행 결과를 다른 데이터 소스에 저장
- 단, 스파크 SQL은 OLAP 데이터베이스로 동작 (OLTP X)
- OLAP (OnLine Analytic Processing, 온라인 분석용)
- OLTP (OnLine Transaction Processing, 온라인 트랜잭션 처리)
- => 따라서 매우 낮은 지연 시간이 필요한 쿼리 수행용도로는 사용 X
- 언젠가는 인플레이스 수정(in-place modification) 방식을 지원할수는 있으나, 현재는 사용 불가
스파크와 하이브의 관계
- 스파크 SQL은 Hive 메타스토어 사용 => 하이브와 연동 good
- Hive 메타스토어는 여러 세션에서 사용할 테이블 정보 보관
- (Hive 사용 시) 스파크 SQL 는 Hive Metastore에 접속해서 조회할 파일 수를 최소화 하기 위해 메타데이터 참조함
- => 기존 하둡 환경의 모든 워크로드를 스파크로 이관하기 좋음
- Hive Metastore
- 접속하기위해 필요한 속성
spark.sql.hive.metastore.version
(default 1.2.1)spark.sql.hive.metastore.jars
: HiveMetastoreClient 초기화 방식 변경
- 스파크는 기본 버전 사용 (호환을 위해 클래스패스에 정의도 가능)
- Hive Metastore가 저장된 다른 데이터베이스 접속 시
- 적합한 클래스 접두사 정의 필요 (ex. MySQL =>
com.mysql.jdbc
) - 접두사 정의 후
spark.sql.hive.metastore.sharedPrefixes
속성에 설정하여 스파크, 하이브에서 공유
- 적합한 클래스 접두사 정의 필요 (ex. MySQL =>
- 사용하던 하이브 메타스토어와 연동 시, 스파크 공식 문서 에서 부가 정보 확인
- 접속하기위해 필요한 속성
10.4 스파크 SQL 쿼리 실행 방법
- 스파크가 SQL 쿼리 실행을 위하여 제공하는 인터페이스
- (1) 스파크 SQL CLI
- (2) 스파크의 프로그래밍 SQL 인터페이스
- (3) 스파크 SQL 쓰리프트 JDBC/ODBC 서버
10.5 카탈로그
- 카탈로그 (catalog) : 스파크 SQL에서 가장 높은 추상화 단계
- 테이블에 저장된 데이터에 대한 메타데이터 + 데이터베이스, 테이블, 함수, 뷰에 대한 정보 까지 추상화
org.apache.spark.sql.catalog.Catalog
패키지- 테이블, 데이터베이스, 함수 조회 등 여러 유용한 함수 제공
- 스파크 SQL을 사용하는 또 다른 방식의 프로그래밍 인터페이스 이다
- =>
saprk.sql
함수를 사용해 관련 코드 실행 가능
- =>
10.6 테이블
- 스파크 SQL 사용을 위해서는 테이블 정의 부터 필요
- 테이블은 ‘명령을 실행할 데이터의 구조’
- DataFrame과 논리적으로 동일
- => 테이블로 조인, 필터링, 집계 등의 여러 데이터 변환 작업 수행 가능
- 테이블 vs DataFrame
- 테이블은 데이터베이스에서 정의, DataFrame은 프로그래밍 언어로 정의
- 스파크에서 테이블 생성시 => default 데이터 베이스에 등록
- 테이블은 ‘항상 데이터를 가지고 있다’ (스파크 2.x 버전)
- 임시 테이블 개념 X
- 데이터를 가지지않은 뷰만 존재 (테이블 X)
- 테이블 제거 시 모든 데이터 제거됨
테이블 다루기
스파크 관리형 테이블
- 테이블은 두 가지 중요 정보 저장 => 테이블의 데이터 & 테이블에 대한 데이터 (메타데이터)
- 관리형 테이블 & 외부 테이블 개념 알기
- 관리형 테이블 : DataFrame의
saveAsTable()
로 생성 (스파크가 관련된 모든 정보를 추적 가능) - 외부 테이블 : 디스크에 저장된 파일을 이용해 테이블을 정의 (파일의 메타데이터 관리)
- 관리형 테이블 : DataFrame의
saveAsTable()
메서드- 테이블을 읽고, 데이터를 스파크 포맷으로 변환 후, 새로운 경로에 저장 (Hive 기본 웨어하우스 경로)
- 저장 경로에서 데이터베이스 목록 확인 가능
- 기본 저장 경로 : /user/hive/warehouse
- 저장 경로 변경? => SparkSession 생성 시
spark.sql.warehouse.dir
에 설정
show tables IN {databaseName}
쿼리로 특정 데이터베이스 테이블 확인 가능
테이블 생성하기
- 다양한 데이터소스로 테이블 생성 가능
- 스파크는 SQL에서 전체 데이터소스 API 재사용 가능
- 즉, 테이블 정의 후 테이블에 데이터 적재 필요 X (?)
- 실행 즉시 테이블 생성
- 파일에서 데이터 읽을 때 모든 종류의 정교한 옵션 지정 가능
USING
(Hive :STORED AS
)- 스파크는 포맷 미 지정 시, 기본적으로 하이브 SerDe 설정 사용 가능 (스파크 자체 직렬화보다 훨씬 느림)
- 테이블 특정 컬럼에 코멘트(
COMMENT
) 추가 가능 - SELECT 쿼리 결과로 테이블 생성 가능
- => CTAS (Create Table .. As .. Select ..) 패턴
- 파티셔닝 데이터셋을 저장해 데이터 레이아웃 제어 가능 (9장 참고)
- 스파크에 접속한 세션에서도 생성된 테이블 사용 가능
- 사용자가 임시 뷰를 만들어서 사용 가능 (스파크에는 임시 테이블 X)
외부 테이블 생성하기
- 스파크 SQL은 HiveQL 과 완벽하게 호환
- HiveQL 대부분 그대로 사용 가능
- 스파크는 외부 테이블의 메타데이터 관리 (스파크에서 데이터 파일은 관리 X)
CREATE EXTERNAL TABLE
구문- 마찬가지로 쿼리 결과로 생성도 가능 (CTAS 패턴)
- 스파크 SQL은 HiveQL 과 완벽하게 호환
테이블에 데이터 삽입하기
INSERT INTO
구문 (표준 SQL 문법 사용)- 특정 파티션에만 저장하고 싶다면? => 파티션 명세 추가
- 쓰기 연산은 파티셔닝 스키마에 맞게 데이터 저장 (단, 매우 느리게 동작할 수도)
테이블 메타데이터 확인하기
DESCRIBE
구문 : 테이블의 메타데이터 정보 반환- 테이블 생성 시 추가된 코멘트 확인 가능
SHOW PARTITIONS
으로 파티셔닝 스키마 정보 확인 가능 (파티션된 테이블인 경우)
테이블 메타데이터 갱신하기
- 가장 최신의 데이터셋을 읽고 있다는 것을 보장하려면? => “테이블 메타데이터 유지” (중요!)
REFRESH TABLE
구문 : 테이블과 관련된 모든 캐싱된 항목 갱신 (기본적으로 파일)- 테이블이 이미 캐싱된 경우, 다음번 스캔 동작하는 시점에 다시 캐싱
REPAIR TABLE
구문 : 카탈로그에서 관리하는 테이블의 파티션 정보 새로고침- 새로운 파티션 정보 수집에 초점
- ex. 수동으로 신규파티션을 만들면 테이블을 수리(repair) 해야함
테이블 제거하기
- 테이블은 삭제(delete)할 수 없고, 오로지 제거(drop) 만 가능하다
DROP TABLE
구문- 관리형 테이블 제거 시, 데이터와 테이블 정의 모두 제거됨
- 존재하지 않는 테이블 제거 시 오류 발생
- => 테이블 존재 시에만 제거하는
DROP TABLE IF EXISTS
대신 사용
- 외부 테이블 제거하기
- 데이터는 삭제되지 않으나, 더는 외부 테이블 명으로 조회 불가
테이블 캐싱하기
CACHE TABLE
로 테이블을 캐시 가능UNCACHE TABLE
로 캐시에서 제거 가능
10.7 뷰
- 뷰는 기존 테이블에 여러 트랜스포메이션 작업 지정
- 기본적으로 뷰는 ‘단순 쿼리 실행 계획’
- 쿼리 로직 체계화 & 재사용하기 편리
- 스파크가 가진 뷰에 관련된 다양한 개념
- 데이터베이스에 설정하는 전역 뷰
- 세션별 뷰
- 최종사용자 입장에서 뷰는 테이블처럼 보인다
- 신규 경로에 모든 데이터를 다시 저장 X
- 대신 단순하게 쿼리시점에 데이터소스에 트랜스포메이션 수행
- 트랜스포메이션 예) filter, select, 대규모 group by, rollup
뷰 다루기
뷰 생성하기
CREATE VIEW
구문 사용- 임시 뷰 생성 :
CREATE TEMP VIEW
- 현재 세션에서만 사용할 수 있는 임시 뷰
- (테이블처럼 데이터베이스에 등록 X)
- 전역적 임시 뷰(global temp view) 생성 :
CREATE GLOBAL TEMP VIEW
- 데이터베이스에 상관없이 사용 가능. 전체 스파크 애플리케이션에서 볼 수 O
- 단, 세션 종료 시 뷰도 제거
- 뷰 덮어쓰기 :
CREATE OR REPLACE TEMP VIEW
(임시뷰, 일반뷰 모두) - 뷰는 실질적으로 트랜스포메이션 이다
- 스파크는 쿼리가 실행될때만 뷰에 정의된 트랜스포메이션 수행
- 즉, 테이블의 데이터를 실제로 조회하는 경우에만 필터 적용
- 뷰는 기존 DataFrame에서 새로운 DataFrame 만드는 것과 동일
뷰 제거하기
DROP VIEW (IF EXISTS)
사용- 뷰 제거 vs 테이블 제거
- 뷰 정의는 제거되지만, 어떤 데이터도 제거되지 않음
- (테이블 제거는 데이터도 모두 제거됨)
10.8 데이터베이스
- 데이터 베이스 = 여러 테이블을 조직화하기 위한 도구
- 데이터베이스 미정의 시 스파크는 기본 데이터베이스 사용 (default)
- 스파크에서 실행하는 모든 SQL 명령문은 실행 중인 데이터베이스 범위에서 실행
데이터베이스 변경 시, 이전에 생성한 모든 사용자 테이블은 변경 전 데이터베이스에 속해 있으므로 다르게 쿼리해야함 (뭔 소린가 했더니..)
- => 즉, 다른 데이터베이스 사용 시
데이터베이스 명 + 테이블 명
으로 조회할 것
SHOW DATABASES
으로 전체 데이터베이스 목록 확인
데이터베이스 다루기
- 데이터베이스 생성하기
CREATE DATABASE
사용
- 데이터베이스 설정하기
USE {databaseName}
으로 쿼리 수행할 데이터베이스 설정- 다른 테이블에 쿼리 수행시 접두사 사용
SELECT current_database()
: 현재 사용중인 데이터베이스 확인
- 데이터베이스 제거하기
DROP DATABASE (IF EXISTS)
사용- Q. 스파크 데이터베이스 삭제 시, 데이터는?
10.9 select 구문
- 스파크 SQL은 ANSI-SQL 요건 충족
- SELECT 표현식 구조는
p.296
참고
- SELECT 표현식 구조는
- case…when…then 구문
- SQL 쿼리 값을 조건에 맞게 처리 가능
- (like if-else statement)
10.10 고급 주제
- 데이터 쿼리 방법 알아보기
- SQL 쿼리 : 특정 명령 집합을 실행하도록 요청하는 SQL 구문
- 조작, 정의, 제어 와 관련된 명령 정의 가능
- => 본 책은 대부분 조작 관련
- 복합 데이터 타입
- 표준SQL에는 존재하지 않는 강력한 기능
- 스파크 SQL의 핵심 복합 데이터 타입 3가지 => 구조체, 리스트, 맵
- 구조체 : 중첩 데이터 생성/쿼리 방법 제공
- 맵에 가까움
- 리스트 : 값의 배열이나 리스트 사용
- 집계 함수
collection_list()
,collect_set()
으로 생성 가능 (단, 집계 연산 시에만 사용 가능) ARRAY
로 컬럼에 직접 배열 생성 가능explode()
: 저장된 배열의 모든 값을 단일 로우 형태로 분해 (<->collect()
)
- 집계 함수
- 함수
- 스파크 SQL은 다양한 고급 함수 제공 (DataFrame 함수 문서 에서 확인)
SHOW FUNCTIONS
으로 스파크 SQL이 제공하는 전체 함수 목록 확인 가능SHOW SYSTEM FUNCTIONS
: 스파크에 내장된 시스템 함수 목록SHOW USER FUNCTIONS
: 누군가가 스파크 환경에 공개한 함수 목록 (= 사용자 정의 함수)- 와일드카드 문자(*)로 필터링 가능
LIKE
키워드 사용 가능
DESCRIBE FUNCTION {functionName}
: 개별 함수의 설명과 사용법 반환- 사용자 정의 함수
- 스파크는 사용자 정의 함수를 정의하여 분산 환경에서 사용할 수 있는 기능 제공
- 특정 언어로 함수 개발 후 등록하여 정의
- 함수 등록/정의 방법 =>
spark.udf.register()
, Hive의CREATE TEMPORARY FUNCTION
- 서브 쿼리
- 서브 쿼리 (subquery) : 쿼리안에 쿼리 지정
- SQL 내 정교한 로직 명시 가능
- => 하나 (스칼라 서브쿼리) 이상의 결과 반환 가능?
- 스파크의 기본 서브쿼리 2가지
- 상호연관 서브쿼리 (correlated subquery) : 쿼리 외부 범위에 있는 일부 정보 사용 가능
- 비상호연관 서브쿼리 (uncorrelated subquery) : 외부 범위 정보 사용 X
- 조건절 서브쿼리 (predicate subquery) 도 지원 => 값에 따라 필터링
- 비상호 스칼라 쿼리(uncorrelated scalar query) 사용 시
- 기존에 없던 일부 부가 정보 가져오기 가능
- (?)
- 서브 쿼리 (subquery) : 쿼리안에 쿼리 지정
10.11 다양한 기능
- 지금까지의 내용과 잘 안맞는 몇가지 특징?
- SQL 코드 성능 최적화, 디버깅 케이스 등..
- 설정
- 스파크 SQL 환경 설정 값 (
p.302-303 [표 10-1]
참고) - 애플리케이션 초기화 시점 or 실행 시점에 설정 가능
- 스파크 SQL 환경 설정 값 (
- SQL에서 설정값 지정하기
SET
사용하여 SQL을 사용하여 환경 설정 가능 (단, 스파크 SQL 관련 설정에 한함)- SQL 설정은 15장에서 자세히
10.12 정리
- 스파크 SQL 관련 세부사항
- 스파크 SQL과 DataFrame은 매우 밀접한 연관
📒 단어장
- ANSI-SQL : 미국 표준 협회 ANSI (American National Standards Institute)에서 정립한 표준 SQL문
- 워크로드 (workloads) : 고객 대면 애플리케이션이나 백엔드 프로세스 같이 비즈니스 가치를 창출하는 리소스 및 코드 모음. 또는 말그대로 시스템이 실행해야할 할당 작업량.
- Thrift Server
- Apache Thrift (RPC Framework)? Hive의 Thrift Server?
- 스파크의 Thrift => 여러 사용자의 JDBC(or OCBC) 접속을 받아 사용자 쿼리를 원격으로 스파크 SQL 세션으로 실행하는 스파크 애플리케이션
- OLTP vs OLAP
- OLTP (OnLine Transaction Processing, 온라인 트랜잭션 처리) 는 DB서버에서 각각의 작업요청의 트랜잭션 처리 (CUD 무결성 보장) & 결과 READ 과정
- OLAP (OnLine Analytic Processing, 온라인 분석용) 는 저장된 데이터를 바탕으로 요구와 목적에 맞는 분석 정보 제공
- 즉, OLTP는 데이터 처리 중심, OLAP는 저장된 데이터 분석 중심
- 인플레이스 수정(in-place modifiction) 방식
- in-place update?