Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Contour 표현식 문법과 함수

Contour 표현식은 Spark SQL의 여러 함수를 포함하는 별도 언어입니다. Expression 보드에서 열을 만들거나 바꾸고, 필터와 집계를 작성합니다. 열 이름은 대소문자를 구분하며 큰따옴표로 감쌀 수 있습니다. year("birthdate_col")과 year(birthdate_col)은 같은 열을 참조합니다.

값과 자료형

문자열은 작은따옴표로 감쌉니다. 문자열 안의 작은따옴표는 두 번 써서 이스케이프합니다.

'This is a string'
'I''m a string'

||는 문자열을 연결합니다. 열과 상수, 계산한 값을 함께 연결할 수 있습니다.

"Gender" || "MaritalStatus"
'$' || ("salaryColumn" / 1000.0) || 'k'

정수 예시는 5, 실수 예시는 5.7입니다. Boolean 값 true와 false는 대소문자를 구분하지 않습니다.

YYYY-MM 또는 YYYY-MM-DD 형식의 문자열을 Date로 변환할 수 있으며 Timestamp도 지원합니다.

CAST('2016-12-06' AS DATE)
CAST('2016-12-06 01:12:34' AS TIMESTAMP)

Timestamp를 LONG으로 변환하면 UNIX 초 단위 값이 됩니다. 밀리초 수준의 소수 부분이 필요하면 DOUBLE을 사용합니다. 다음 식은 두 시각 사이의 분 차이를 계산합니다.

(CAST("end" AS LONG) - CAST("start" AS LONG)) / 60

LONG을 Timestamp로 바꿀 때도 단위는 초입니다. 입력이 밀리초이면 1,000으로 나눈 뒤 변환합니다.

연산

산술과 대소 비교

숫자 열과 상수에는 +, -, *, / 연산을 적용할 수 있습니다.

"tipAmount" / "fare"
"diameter" * 3.14

, >=, <, <=로 값의 크기를 비교하면 Boolean 결과를 얻습니다.

"age" > "averageAge"
"totalDistance" < 5

문자열은 문자 인코딩에 따른 사전식 순서로 비교합니다. 다음 비교는 모두 true입니다.

비교이유
'Alligator' < 'Boat'A가 B보다 앞섬
'Alliance' < 'Alligator'처음 다른 문자 a가 g보다 앞섬
'Zoo' < 'alpha'대문자 Z가 소문자 a보다 앞섬
'Zoo' < 'Zoologist'접두사가 같으면 짧은 문자열이 앞섬
'1' < '2'문자 1이 문자 2보다 앞섬
'10' < '2'첫 문자를 비교하므로 숫자 10과 2의 비교와 다름
'10' < '20'첫 문자 1이 2보다 앞섬

동등성과 null

==는 같은 값인지, !=는 다른 값인지 비교합니다. 열끼리 또는 열과 상수를 비교할 수 있습니다.

"cityOfBirth" == "cityOfResidence"
"Gender" == 'M'

Contour의 동등성 비교는 null을 다음과 같이 처리합니다. 일반 Spark SQL로 옮길 때 이 차이를 반영해야 합니다.

식ContourSpark SQL
NULL = 'DATA'falseNULL
NULL != 'DATA'trueNULL
NULL = NULLtrueNULL
NULL != NULLfalseNULL

값의 존재 여부는 IS NULL 또는 IS NOT NULL로 검사할 수도 있습니다.

논리식, 형변환과 조건 분기

"Age" >= 70 AND "Gender" = 'M'
CAST("startDate" AS DATE)
CAST("startTime" AS TIMESTAMP)
CAST("numParticipants" AS INTEGER)

CAST는 Boolean, Integer, Double, Date와 Timestamp 등의 형변환에 사용합니다. CASE는 위에서부터 조건을 평가하여 처음 true인 THEN 값을 선택합니다.

CASE
    WHEN "age" < 13 THEN 'Child'
    WHEN "age" > 19 THEN 'Adult'
    ELSE 'Teenager'
END

하나의 값을 여러 상수와 비교하는 형식도 사용할 수 있습니다.

CASE MaritalStatus
    WHEN 'S' THEN 'Single'
    WHEN 'M' THEN 'Married'
    ELSE 'Unknown'
END

LIKE는 문자열 패턴을 비교합니다. 예를 들어 "country_name" LIKE '%a'는 a로 끝나는 값을 찾습니다.

우선순위

다음은 높은 우선순위부터 나열한 순서입니다. 같은 줄의 연산자는 같은 우선순위입니다.

  1. 단항 +, -, NOT
  2. 문자열 연결 ||
  3. *, /, %
  4. 이항 +, -
  5. <, <=, >, >=
  6. =, ==, !=, <>, IS, IS NOT, LIKE, RLIKE
  7. IS NULL, IS NOT NULL
  8. IN, NOT IN
  9. AND
  10. OR

함수의 인자

아래 arg0, arg1, arg2는 첫 번째, 두 번째, 세 번째 인자를 뜻합니다. 리터럴 제약이 있는 인자에는 지정한 자료형의 상수를 전달합니다.

수학과 숫자

함수동작과 인자 조건
ABS절댓값
CBRT세제곱근
CEIL올림
COS코사인
EXP지수 함수
FACTORIAL계승
FLOOR내림
FORMAT_NUMBERarg0을 arg1 소수 자릿수로 반올림하여 #,###,###.## 형식의 문자열 반환. arg1은 정수 리터럴
ISNAN값이 NaN이면 true
LN자연로그
LOG밑 arg0에 대한 arg1의 로그. arg0은 숫자 리터럴
POWarg0의 arg1 제곱
RANDarg0 시드를 사용하여 각 행에 0과 1 사이 난수 생성
ROUNDarg0을 arg1 소수 자릿수로 반올림. arg1은 정수 리터럴
SIN사인
SQRT제곱근
TAN탄젠트

문자열

아래 name 값은 Jane인 예시입니다. 입력 열 이름과 값은 각 데이터셋에 맞춥니다.

함수동작, 조건과 예시
CONCAT여러 문자열 연결. CONCAT("firstName", "lastName")은 Jane과 Doe를 JaneDoe로 연결
CONCAT_WSarg0 구분자로 문자열 연결. arg0은 문자열 리터럴. CONCAT_WS(' ', "firstName", "lastName")은 Jane Doe
FORMAT_STRINGJava Formatter 형식으로 인자를 문자열로 변환. salary가 1234.5이면 FORMAT_STRING('%.2f', "salary")는 1234.50
LENGTH문자열 또는 바이너리의 길이. LENGTH("name")은 4
LEVENSHTEIN두 문자열의 편집 거리. kitten과 sitting에 대한 LEVENSHTEIN("wordA", "wordB")는 3
LOWER소문자로 변환. LOWER("name")은 jane
LPADarg0 왼쪽에 arg2를 붙여 길이 arg1로 맞춤. arg1은 정수, arg2는 문자열 리터럴. id가 42이면 LPAD("id", 5, '0')은 00042
LTRIM왼쪽 공백 제거. 앞에 공백이 있는 Jane에 적용하면 Jane
REGEXP_EXTRACTarg0에서 정규식 arg1의 그룹 arg2 추출. 그룹 번호는 1부터 시작하며 패턴 또는 그룹이 매칭되지 않으면 빈 문자열. arg1은 문자열, arg2는 정수 리터럴. REGEXP_EXTRACT("email", '([^@]+)@', 1)은 jane@example.com에서 jane 추출
REGEXP_REPLACEarg0에서 정규식 arg1에 맞는 모든 부분을 arg2로 교체. REGEXP_REPLACE("phone", '[^0-9]', '')은 555-1234를 5551234로 변환
REVERSE문자열 순서 반전. REVERSE("name")은 enaJ
RPADarg0 오른쪽에 arg2를 붙여 길이 arg1로 맞춤. arg1은 정수, arg2는 문자열 리터럴. code가 AB이면 RPAD("code", 5, '*')는 AB***
RTRIM오른쪽 공백 제거
SPLIT정규식 arg1로 arg0을 나누어 배열 열 하나를 반환. arg1은 문자열 리터럴. SPLIT("fullName", ' ')은 Jane Doe를 ['Jane', 'Doe']로 분리
SUBSTRINGarg0의 1 기반 위치 arg1부터 길이 arg2만큼 추출. arg1과 arg2는 정수 리터럴. SUBSTRING("name", 1, 3)은 Jan
TRIM양끝 공백 제거. 양끝에 공백이 있는 Jane에 적용하면 Jane
UPPER대문자로 변환. UPPER("name")은 JANE

SPLIT의 구분자는 정규식입니다. 특수 문자를 그대로 찾으려면 Expression 보드 예제처럼 이스케이프합니다.

날짜와 시각

함수동작과 인자 조건
ADD_MONTHSarg0에서 arg1개월 뒤의 날짜. arg1은 정수 리터럴
CURRENT_DATE현재 날짜. 경로를 다시 계산할 때 값 갱신
CURRENT_TIMESTAMP현재 Timestamp. 경로 재계산 시 갱신
CURRENT_UNIX_TIMESTAMP현재 UNIX 초 값. 경로 재계산 시 갱신
DATE_ADDarg0에서 arg1일 뒤의 날짜. arg1은 정수 리터럴
DATE_FORMAT날짜 또는 Timestamp arg0을 형식 arg1에 따라 문자열로 변환. arg1은 문자열 리터럴
DATE_SUBarg0에서 arg1일 전의 날짜. arg1은 정수 리터럴
DATE_TRUNC날짜 또는 Timestamp arg1을 arg0 단위의 시작으로 절삭
DATE_DIFFarg1부터 arg0까지의 일수
DAY_OF_MONTH날짜, Timestamp 또는 문자열에서 월의 일자 추출
DAY_OF_WEEK요일 정수. 일요일 1부터 토요일 7까지
DAY_OF_YEAR연중 일자 추출
FROM_UTC_TIMESTAMPUTC 기준 시각 arg0을 시간대 arg1의 지역 시각 표현으로 변환. arg1은 문자열 리터럴
HOUR시 추출
LAST_DAY날짜가 속한 달의 마지막 날짜
MINUTE분 추출
MONTH월 추출
MONTHS_BETWEENarg0과 arg1 사이의 개월 수
QUARTER분기 추출
SECOND초 추출
TO_UNIX_TIMESTAMP형식 arg1로 시각 문자열 arg0을 읽어 UNIX 시각으로 변환. 실패하면 null. arg1은 문자열 리터럴
TO_UTC_TIMESTAMP시간대 arg1의 지역 시각 표현인 arg0을 UTC 기준 시각으로 변환. arg1은 문자열 리터럴
WEEK_OF_YEARISO 주 번호. 주는 월요일에 시작하며 주 번호는 1부터 53까지 가능
YEAR연도 추출

CURRENT_DATE 등 현재 시각 함수는 화면을 다시 보았다는 이유만으로 갱신되지 않습니다. 날짜 기준 결과가 보드 사이에서 어긋나지 않도록 필요한 주기로 경로를 갱신합니다. CURRENT_DATE를 사용하는 일 단위 분석에는 매일 갱신하는 방식이 권장됩니다. 달력 경계를 포함하는 계산은 직전 여덟 주 예제를 참고합니다.

배열과 배열 펼치기

배열은 Expression 보드에서 처리합니다. 다른 보드에 문자열을 전달하려면 ARRAY_JOIN을 사용합니다.

함수동작과 인자 조건
ARRAY입력 열들의 값으로 배열 생성
ARRAY_CONTAINS배열 arg0에 arg1 값이 있는지 확인. arg1은 리터럴
ARRAY_GET_AT_INDEX배열 arg0의 1 기반 인덱스 arg1 원소. arg1은 정수 리터럴. 다른 보드에서 사용하려면 반환값의 자료형을 명시적으로 CAST
ARRAY_LENGTH배열 길이. 입력이 null이면 -1
ARRAY_JOIN배열 arg0의 원소를 문자열 리터럴 arg1로 연결
ARRAY_SORTarg1이 true이면 오름차순, false이면 내림차순. arg1은 Boolean 리터럴
EXPLODE배열의 원소마다 행 생성. null 또는 빈 배열의 입력 행은 출력하지 않음
EXPLODE_OUTER배열의 원소마다 행 생성. null 또는 빈 배열에도 null 값을 가진 행 유지

EXPLODE와 EXPLODE_OUTER는 행을 펼치는 함수이며 OVER 절을 붙이지 않습니다. 펼친 결과를 다른 보드에서 사용하려면 이후 Expression 보드에서 결과 열을 명시적으로 CAST합니다. 배열 예제에서 배열과 연결한 문자열을 구분합니다.

윈도 함수

윈도 함수에는 OVER 절을 사용합니다. 윈도 정의에 따라 전체 행 또는 각 파티션과 프레임을 계산합니다.

함수동작과 인자 조건
CUME_DIST파티션의 정렬 순서에서 현재 행까지 차지하는 행의 비율. 현재 행과 정렬값이 같은 행도 포함
DENSE_RANK동률 다음 순위에 빈 번호가 없는 순위
FIRST그룹의 첫 값
LAGarg0의 현재 행보다 arg1행 앞의 값. 해당 행이 없으면 null. arg1은 정수 리터럴
LAST그룹의 마지막 값
LEADarg0의 현재 행보다 arg1행 뒤의 값. 해당 행이 없으면 null. arg1은 정수 리터럴
NTILE정렬된 파티션을 arg0개 그룹으로 나누어 1부터 arg0까지의 그룹 번호 반환. arg0은 정수 리터럴
PERCENT_RANK파티션 안의 상대 순위
RANK동률에 같은 순위를 부여하고 다음 순위 번호에는 빈 번호가 생길 수 있는 순위
ROW_NUMBER파티션 안에서 1부터 증가하는 행 번호

정렬 기준이 같은 행이 여러 개 있으면 ROW_NUMBER, FIRST, LAST, LEAD, LAG, NTILE과 순서에 영향을 받는 배열 집계 결과가 실행마다 달라질 수 있습니다. 필요한 경우 고유한 보조 정렬 키를 지정합니다.

집계

집계 함수는 Aggregate 모드 또는 지원되는 윈도 표현식에서 사용합니다.

함수동작과 제한
ARRAY_AGG입력 열의 값을 배열로 집계
ARRAY_AGG_DISTINCT고유값을 배열로 집계
AVG평균
COUNT항목 수
COUNT_DISTINCT고유값 수. Expression 보드의 Aggregate 모드에서만 지원하며 Add new column, Filter, Replace column에서는 사용 불가
CORR두 열의 피어슨 상관계수
MAX최댓값
MEAN평균
MIN최솟값
STDDEV표본 표준편차
SUM합계
SUM_DISTINCT고유값의 합계. 윈도 함수로 사용 불가
VARIANCE불편 분산

ARRAY_AGG와 ARRAY_AGG_DISTINCT의 값 순서는 정렬 조건의 동률에 영향을 받을 수 있습니다. 순서 자체가 결과의 일부라면 별도로 순서를 정합니다.

기타

함수동작
COALESCE처음으로 null이 아닌 값. 모두 null이면 null
GREATESTnull을 제외한 값 중 최댓값
HASH입력 열의 해시 코드를 int로 반환
ISNULL값이 null이면 true
LEASTnull을 제외한 값 중 최솟값
MD5바이너리 입력의 MD5를 32자리 16진 문자열로 반환
MONOTONICALLY_INCREASING_ID단조 증가 ID 생성. 경로를 계산할 때마다 값이 달라질 수 있음
SHA1바이너리 입력의 SHA-1을 40자리 16진 문자열로 반환
GET_JSON_OBJECTJSON 문자열에서 JSONPath로 지정한 값을 문자열로 추출. 경로 예: $.field, $['field']