SQL 변환과 Spark SQL 참조
대화형으로 자료를 탐색하고 쿼리를 수정하려면 SQL Studio를 사용합니다. 자동 완성, 인라인 오류 표시와 결과 시각화 등을 제공하며 표 데이터를 읽고 쓸 수 있습니다.
SQL을 코드 저장소에서 관리하는 파이프라인으로 만들려면 Code Repositories의 SQL 변환을 사용합니다. 필터, 집계, 파생 열과 window 등 Spark SQL 연산을 작성할 수 있습니다. Foundry의 SQL 변환은 증분 변환을 지원하지 않습니다. 저장소 생성부터 빌드까지는 배치 파이프라인 예제에 설명되어 있습니다.
쿼리의 기본 구조
Code Repositories의 SQL 변환은 출력 테이블을 만드는 CREATE TABLE ... AS SELECT ... 형식으로 작성합니다. 다음 경로는 가상의 예시이며 실제 Foundry 데이터셋 경로로 바꿉니다.
CREATE TABLE `/Example Project/Outputs/copied_data` AS
SELECT * FROM `/Example Project/Inputs/source_data`
조회 부분을 괄호로 감싸는 형식도 사용할 수 있습니다.
CREATE TABLE `/Example Project/Outputs/copied_data` AS (
SELECT * FROM `/Example Project/Inputs/source_data`
)
Foundry SQL 변환 파일에서는 문장 끝에 세미콜론을 넣지 않습니다. 일반 SQL 클라이언트의 구분자 처리와 별개의 작성 조건입니다. 경로의 백틱은 Foundry 데이터셋 참조이며, 임의의 로컬 Spark catalog에 같은 경로 이름의 테이블이 있다는 뜻은 아닙니다.
한 줄 주석은 --, 여러 줄 주석은 /* ... */를 사용합니다.
-- 활성 항목만 결과에 포함합니다.
CREATE TABLE `/Example Project/Outputs/active_data` AS
SELECT id, name
FROM `/Example Project/Inputs/source_data`
WHERE is_active = true
이름, 열과 파생 열
데이터셋 경로와 출력 이름의 철자 및 대소문자를 정확히 유지합니다. 열은 Name처럼 이름으로 참조하며, Spark의 열/alias 해석에는 case-sensitive 설정이 영향을 줄 수 있습니다. 대소문자만 다른 이름에 의존하지 않는 편이 안전합니다.
파생 열에는 AS로 이름을 붙입니다. 예를 들어 Name 문자열과 Val 숫자 열이 있는 입력에서 합계 결과에 Total이라는 이름을 지정합니다.
CREATE TABLE `/Example Project/Outputs/totals` AS
SELECT SUM(Val) AS Total
FROM `/Example Project/Inputs/source_data`
이후 함수 참조의 SELECT 예제는 조회 부분을 설명합니다. 실제 SQL 변환에는 이처럼 출력 경로의 CREATE TABLE 구문을 함께 사용합니다. SQL Studio와 다른 연결 엔진에서는 해당 엔진의 SQL 방언을 따릅니다.
WHERE, GROUP BY와 alias
같은 SELECT에서 만든 alias를 WHERE 조건으로 사용하지 않고 원래 표현식을 반복하거나 하위 쿼리를 둡니다. GROUP BY도 표현식을 반복하면 alias 해석 설정에 의존하지 않습니다.
SELECT LOWER(Name) AS LowercaseName
FROM `/Example Project/Inputs/source_data`
WHERE LOWER(Name) = 'sara'
SELECT LOWER(Name) AS LowercaseName, SUM(Val) AS Total
FROM `/Example Project/Inputs/source_data`
GROUP BY LOWER(Name)
ORDER BY와 HAVING에는 결과 alias를 사용할 수 있습니다. 다음은 같은 정렬을 표현하는 두 방식입니다.
SELECT LOWER(Name) AS LowercaseName, SUM(Val) AS Total
FROM `/Example Project/Inputs/source_data`
GROUP BY LOWER(Name)
ORDER BY Total
SELECT LOWER(Name) AS LowercaseName, SUM(Val) AS Total
FROM `/Example Project/Inputs/source_data`
GROUP BY LOWER(Name)
ORDER BY SUM(Val)
집계 조건도 alias 또는 집계식으로 표현합니다.
SELECT LOWER(Name) AS LowercaseName, SUM(Val) AS Total
FROM `/Example Project/Inputs/source_data`
GROUP BY LOWER(Name)
HAVING Total > 100
SELECT LOWER(Name) AS LowercaseName, SUM(Val) AS Total
FROM `/Example Project/Inputs/source_data`
GROUP BY LOWER(Name)
HAVING SUM(Val) > 100
CAST와 오류 처리
CAST(expression AS type)으로 자료형을 변환합니다. 기본적인 대상 타입은 boolean, tinyint, smallint, int, bigint, float, double, decimal, date, timestamp, binary, string입니다. decimal은 필요한 precision과 scale을 명시할 수 있습니다.
Spark SQL은 Hive 호환 기능과 ANSI 동작을 함께 제공하므로 모든 형식 오류를 항상 NULL로 처리한다고 가정하지 않습니다. spark.sql.ansi.enabled가 켜져 있으면 잘못된 파싱이나 일부 overflow가 오류로 전파됩니다. 꺼진 환경의 잘못된 문자열 cast는 NULL을 반환할 수 있으며, 자료형 조합 자체가 허용되지 않으면 분석 오류가 날 수도 있습니다. 저장 시 자료형 할당 정책은 별도 설정입니다.
날짜 변환 예
Date에는 시간 부분이 없고 일반적인 문자열 표시는 yyyy-MM-dd입니다. Timestamp를 만들 때 시간 정보가 없는 문자열은 해석하는 시간대의 자정으로 처리합니다.
| 표현식 | 의미 |
|---|---|
CAST('2016-07-30' AS DATE) | ISO 날짜를 Date로 변환 |
CAST('2016-07-30' AS TIMESTAMP) | 해당 날짜 자정의 Timestamp |
TO_DATE(CAST(UNIX_TIMESTAMP('07302016', 'MMddyyyy') AS TIMESTAMP)) | 월/일/연도 순서 문자열을 날짜로 변환 |
CAST('2016-07-30 11:29:27' AS DATE) | 시각 문자열에서 날짜만 남김 |
TO_DATE('2016-07-30T11:29:27.000+00:00') | ISO 8601 문자열의 날짜 부분 |
TO_DATE('2016-07-30 11:29:27') | 날짜와 시각 문자열에서 날짜 부분 |
20160730처럼 구분자가 없는 값은 단순 CAST의 기본 날짜 형식으로 간주하지 말고, 지원되는 명시적 형식 파싱에서 yyyyMMdd를 지정합니다. 잘못된 형식의 NULL/오류 동작은 위 ANSI 조건을 따릅니다. 시각을 다른 시간대의 날짜로 해석하려면 Timestamp 변환과 시간대 정책을 먼저 적용합니다.
함수 범주
함수의 expr 인자는 열 참조나 SQL 값 표현식입니다. 함수 이름과 인자 형태, 반환 및 NULL 조건을 다음 장에서 설명합니다.