UDF라고 해서 Dataframe이나 Spark SQL에서 데이터 처리 함수를 커스터마이징할 수 있다.
윈도우 함수는 행과 행간의 관계를 나타내는 함수로 행의 갯수에 영향을 끼치지 않는다. 그냥 새로운 ROW들을 만든다고 생각하면 된다. GROUP BY, ORDER BY와 함께 쓸 수 없다.
집계 : Count, AVG, MAX, MIN 랭킹 : RANK, ROW_NUMBER 행 순서 관련 : FIRST_VALUE, LAST_VALUE
기본적으로 함수명(인자) OVER (PARTITION BY, ORDER BY, WINDOWING)으로 나뉜다.
PARTITION BY는 어떤 기준으로 ROW들을 나눌 건지에 대한 것이며 GROUP BY와 비슷하다고 보면 된다. ORDER BY는 정해진 파티션 안에서 어떤 기준으로 WINDOW 구간을 정렬할 것인지 선택한다. 마지막으로 WINDOWING은 ROW마다 각기 다른 적용 구간을 두기 위해 사용한다.
보통 ROWS BETWEEN A AND B 구조로 사용한다. 이때 A와 B에는 UNBOUNDED PRECEDING(맨 처음 행), CURRENT ROW, UNBOUNDED FOLLOWING (맨 마지막 행)이 대표적으로 들어간다.
GROUP BY & HAVING
Group by는 말그대로 행들을 특정 기준으로 묶어준다. Group by를 사용할 때 보통 묶어주는 컬럼을 SELECT에 적어줘야 하며 GROUP BY에 해당하지 않는 컬럼은 집계 함수(count, sum, avg) 등을 사용하는 편이다.
HAVING은 GROUP BY로 그루핑 된 것들을 기준으로 집계 함수 clause가 가능하다. 즉 sum, avg 등의 조건문을 통해 필터링을 걸 수있다. WHERE는 GROUP BY가 적용되기 전 ROW에 해당한다면 GROUP BY느 그루핑 된 이후 조건이라고 보면 편할 듯
PIVOT
크로스 집계(PIVOTING)를 할 때 사용하는 기술임. ROW의 특정 컬럼의 필드 값을 컬럼으로 하는 테이블을 만드는 행위. OLAP 데이터 분석을 할 때 굉장히 자주 기본적으로 사용됨. 다차원 데이터를 만든다고 보면 됨. 보통 디멘젼과 측정값으로 나뉜다. 측정값에 들어가는 건 보통 집계함수를 넣어서 표현하는 편임.
VIEW는 메모리상에 올라가는 가상 테이블이라고 보면 됨. WITH AS도 일종의 VIEW를 만든느 것임. RECURSIVE도 VIEW를 만드는 과정인데 반복적인 수행을 통해 VIEW를 만드는 친구임.
#h 컬럼에 0 ~ 23까지 값을 가지는 뷰를 만든다
WITH RECURSIVE VIEW이름 AS (
SELECT 0 AS h
UNION ALL
SELECT h+1 FROM VIEW이름 WHERE h < 24
)