시스템
시스템 (내장) 함수 [System (Built-in) Functions]
Flink Table API & SQL은 데이터 변환을 위한 내장 함수 집합을 사용자에게 제공해요. 이 페이지는 그것들의 간단한 개요를 제공해요. 필요한 함수가 아직 지원되지 않는다면 사용자 정의 함수를 구현할 수 있어요. 함수가 충분히 일반적이라고 생각되면, 상세한 설명과 함께 Jira 이슈를 열어주세요.
출처: 문서
본문
스칼라 함수 (Scalar Functions)
스칼라 함수는 입력으로 0개, 1개 또는 그 이상의 값을 받고 결과로 단일 값을 반환해요.
비교 함수 (Comparison Functions)
| SQL 함수 | Table 함수 | 설명(Description) |
|---|---|---|
| value1 = value2 | value1 === value2 | value1과 value2가 같으면 TRUE를 반환하며, value1 또는 value2가 NULL이면 UNKNOWN을 반환해요. |
| value1 <> value2 | value1 !== value2 | value1과 value2가 같지 않으면 TRUE를 반환하며, value1 또는 value2가 NULL이면 UNKNOWN을 반환해요. |
| value1 > value2 | value1 > value2 | value1이 value2보다 크면 TRUE를 반환하며, value1 또는 value2가 NULL이면 UNKNOWN을 반환해요. |
| value1 >= value2 | value1 >= value2 | value1이 value2보다 크거나 같으면 TRUE를 반환하며, value1 또는 value2가 NULL이면 UNKNOWN을 반환해요. |
| value1 < value2 | value1 < value2 | value1이 value2보다 작으면 TRUE를 반환하며, value1 또는 value2가 NULL이면 UNKNOWN을 반환해요. |
| value1 <= value2 | value1 <= value2 | value1이 value2보다 작거나 같으면 TRUE를 반환하며, value1 또는 value2가 NULL이면 UNKNOWN을 반환해요. |
| value IS NULL | value.isNull | value가 NULL이면 TRUE를 반환해요. |
| value IS NOT NULL | value.isNotNull | value가 NULL이 아니면 TRUE를 반환해요. |
| value1 IS DISTINCT FROM value2 | N/A | 두 값이 다르면 TRUE를 반환해요. 여기서 NULL 값은 동일한 것으로 취급돼요. 예: 1 IS DISTINCT FROM NULL은 TRUE, NULL IS DISTINCT FROM NULL은 FALSE. |
| value1 IS NOT DISTINCT FROM value2 | N/A | 두 값이 같으면 TRUE를 반환해요. NULL 값은 동일한 것으로 취급돼요. 예: 1 IS NOT DISTINCT FROM NULL은 FALSE, NULL IS NOT DISTINCT FROM NULL은 TRUE. |
| value1 BETWEEN [ ASYMMETRIC | SYMMETRIC ] value2 AND value3 | N/A | 기본(또는 ASYMMETRIC 키워드)으로 value1이 value2보다 크거나 같고 value3보다 작거나 같으면 TRUE를 반환해요. SYMMETRIC 키워드로는 value1이 value2와 value3 사이에 포함되면 TRUE를 반환해요. value2나 value3이 NULL이면 FALSE 또는 UNKNOWN을 반환해요. |
| value1 NOT BETWEEN [ ASYMMETRIC | SYMMETRIC ] value2 AND value3 | N/A | 기본(또는 ASYMMETRIC 키워드)으로 value1이 value2보다 작거나 value3보다 크면 TRUE를 반환해요. SYMMETRIC 키워드로는 value1이 value2와 value3 사이에 포함되지 않으면 TRUE를 반환해요. value2나 value3이 NULL이면 TRUE 또는 UNKNOWN을 반환해요. |
| string1 LIKE string2 [ ESCAPE char ] | string1.like(string2[, char]) | string1이 패턴 string2와 일치하면 TRUE를 반환하며, string1 또는 string2가 NULL이면 UNKNOWN을 반환해요. 필요하다면 ESCAPE 절을 사용해 단일 문자로 구성된 이스케이프 문자를 정의할 수 있어요. 기본 이스케이프 문자는 없어요. |
| string1 NOT LIKE string2 [ ESCAPE char ] | N/A | string1이 패턴 string2와 일치하지 않으면 TRUE를 반환하며, string1 또는 string2가 NULL이면 UNKNOWN을 반환해요. |
| string1 SIMILAR TO string2 [ ESCAPE char ] | string1.similar(string2) | string1이 SQL 정규 표현식 string2와 일치하면 TRUE를 반환하며, string1 또는 string2가 NULL이면 UNKNOWN을 반환해요. |
| value1 IN (value2 [, value3]* ) | value1.in(value2) | value1이 주어진 목록(value2, value3, …)에 존재하면 TRUE를 반환해요. (value2, value3, …)에 NULL이 포함되면 요소를 찾으면 TRUE, 그렇지 않으면 UNKNOWN을 반환해요. value1이 NULL이면 항상 UNKNOWN을 반환해요. |
| EXISTS (sub-query) | N/A | 서브쿼리가 최소 하나의 행을 반환하면 TRUE를 반환해요. 연산이 조인과 그룹 연산으로 재작성될 수 있는 경우에만 지원돼요. |
이 밖에도 논리 함수, 산술 함수, 문자열 함수, 시간 함수, 컬렉션 함수, 조건부 함수 등 다양한 스칼라 함수가 있어요. 예를 들어 UPPER, LOWER, TRIM, ABS, MOD, CONCAT, SUBSTRING, CURRENT_TIMESTAMP, YEAR 등이 있어요. 전체 목록은 Scalar Functions 섹션을 참고하세요.
보조 함수 (Auxiliary Functions)
| SQL 함수 | Table 함수 | 설명(Description) |
|---|---|---|
| N/A | callSql(STRING) | SQL 표현식 호출. 주어진 문자열은 플래닝 중 파싱되어 Table API 표현식으로 번역돼요. 런타임 중 평가되는 것은 번역된 표현식뿐이에요. 현재 호출은 간단한 스칼라 표현식으로 제한돼요. 집계 또는 테이블 값 함수 호출은 지원되지 않아요. 서브쿼리도 허용되지 않아요. |
| N/A | ANY.as(NAME1, NAME2, ...) | ANY(필드)에 이름을 지정해요. 표현식이 여러 필드로 확장되면 추가 이름이 지정될 수 있어요. |
집계 함수 (Aggregate Functions)
집계 함수는 모든 행에 걸친 표현식을 입력으로 받고 결과로 단일 집계 값을 반환해요.
| SQL 함수 | Table 함수 | 설명(Description) |
|---|---|---|
| COUNT([ ALL ] expression | DISTINCT expression1 [, expression2]*) | N/A | 기본 또는 ALL로, expression이 NULL이 아닌 입력 행의 수를 반환해요. DISTINCT는 각 값의 고유 인스턴스 하나에 사용돼요. |
| COUNT(*) COUNT(1) | FIELD.count | 입력 행 수를 반환해요. |
| AVG([ ALL | DISTINCT ] expression) | FIELD.avg | 기본 또는 ALL 키워드로, 모든 입력 행에 걸친 expression의 평균(산술 평균)을 반환해요. DISTINCT는 각 값의 고유 인스턴스 하나에 사용돼요. |
| SUM([ ALL | DISTINCT ] expression) | FIELD.sum | 기본 또는 ALL 키워드로, 모든 입력 행에 걸친 expression의 합을 반환해요. DISTINCT는 고유 인스턴스에 사용돼요. |
| MAX([ ALL | DISTINCT ] expression) | FIELD.max | 기본 또는 ALL 키워드로, 모든 입력 행에 걸친 expression의 최댓값을 반환해요. DISTINCT는 고유 인스턴스에 사용돼요. |
| MIN([ ALL | DISTINCT ] expression ) | FIELD.min | 기본 또는 ALL 키워드로, 모든 입력 행에 걸친 expression의 최솟값을 반환해요. DISTINCT는 고유 인스턴스에 사용돼요. |
| STDDEV_POP / STDDEV_SAMP | FIELD.stddevPop / FIELD.stddevSamp | 모집단/표본 표준 편차를 반환해요. |
| VAR_POP / VAR_SAMP | FIELD.varPop / FIELD.varSamp | 모집단/표본 분산을 반환해요. |
| COLLECT([ ALL | DISTINCT ] expression) | FIELD.collect | 모든 입력 행에 걸친 expression의 multiset을 반환해요. NULL 값은 무시돼요. |
| RANK() / DENSE_RANK() | N/A | 값 그룹에서 값의 순위를 반환해요. RANK는 시퀀스에 공백을 만들고, DENSE_RANK는 공백을 만들지 않아요. |
| ROW_NUMBER() | N/A | 윈도우 파티션 내 행 순서에 따라 1부터 시작해 각 행에 고유한 순차 번호를 할당해요. |
| LEAD(expression [, offset] [, default]) / LAG(...) | lead(...) / lag(...) | 창에서 현재 행의 offset번째 앞/뒤 행의 값을 반환해요. |
| FIRST_VALUE / LAST_VALUE | FIELD.firstValue / FIELD.lastValue | 정렬된 값 집합 중 첫/마지막 값을 반환해요. |
| LISTAGG(expression [, separator]) | FIELD.listagg | 문자열 표현식의 값을 연결하고 사이에 구분자 값을 넣어요. 기본 구분자는 ','예요. |
| CUME_DIST() / PERCENT_RANK() | N/A | 값 그룹 내 값의 누적 분포/백분위 순위를 반환해요. |
| NTILE(n) | N/A | 각 윈도우 파티션의 행을 n개의 버킷으로 나눠요. |
| ARRAY_AGG | FIELD.arrayAgg | 입력 행을 연결해 배열을 반환해요. |
| PERCENTILE(expr, percentage[, frequency]) | expr.percentile(percentage[, frequency]) | 연속 분포를 사용해 지정된 백분율에서 expr의 백분위수 값을 반환해요. |
비트맵 집계 함수 (Bitmap Aggregate Functions)
성능 팁:
- MiniBatch 집계를 활성화하거나 윈도우 집계 안에서 비트맵 집계 함수를 사용해 상태 접근 오버헤드를 최적화하고 성능을 크게 개선하는 것을 강력히 권장해요.
- 비트맵 집계 함수는 append-only 입력에서 가장 잘 동작해요. retraction 입력에서는 성능이 눈에 띄게 저하되므로, 가능하면 BITMAP 컬럼에 대해 다중 레벨 GROUP BY 집계를 피해요.
- 중간 비트맵이 필요 없는 카디널리티 전용 시나리오에서는
BITMAP_XX_CARDINALITY_AGG()가BITMAP_CARDINALITY(BITMAP_XX_AGG())보다 선호돼요. 기능적으로 동일하지만, 전자가 중간 비트맵 실체화를 피하고 더 잘 동작해요.
| SQL 함수 | Table 함수 | 설명(Description) |
|---|---|---|
| BITMAP_AND_AGG(bitmap) | bitmap.bitmapAndAgg() | 여러 비트맵의 AND(교집합)를 집계해요. |
| BITMAP_AND_CARDINALITY_AGG(bitmap) | bitmap.bitmapAndCardinalityAgg() | 여러 비트맵의 AND(교집합)를 집계하고 64비트 카디널리티를 반환해요. |
| BITMAP_BUILD_AGG(value) | value.bitmapBuildAgg() | 32비트 정수를 비트맵으로 집계해요. |
| BITMAP_OR_AGG(bitmap) | bitmap.bitmapOrAgg() | 여러 비트맵의 OR(합집합)를 집계해요. |
| BITMAP_XOR_AGG(bitmap) | bitmap.bitmapXorAgg() | 여러 비트맵의 XOR(대칭 차집합)를 집계해요. |
시간 간격 및 시점 단위 지정자 (Time Interval and Point Unit Specifiers)
다음 표는 시간 간격과 시점 단위의 지정자를 나열해요.
Table API에서는 공백 대신 _를 사용해요(예: DAY_TO_HOUR).
복수형(Plural)은 SQL에서만 동작해요.
| 시간 간격 단위(Time Interval Unit) | 시점 단위(Time Point Unit) |
|---|---|
MILLENNIUM |
|
CENTURY |
|
DECADE |
|
YEAR(S) |
YEAR |
MONTH(S) |
MONTH |
WEEK(S) |
|
DAY(S) |
DAY |
HOUR(S) |
HOUR |
MINUTE(S) |
MINUTE |
SECOND(S) |
SECOND |
MILLISECOND(S) |
MILLISECOND |
MICROSECOND(S) |
MICROSECOND |
NANOSECOND(S) |
NANOSECOND |
컬럼 함수 (Column Functions)
컬럼 함수는 SELECT 목록에서 비정규화된 컬럼을 나타내는 데 사용돼요.
| SQL 함수 | 설명(Description) |
|---|---|
DEFAULT |
SELECT 목록에서 DEFAULT를 정의해 컬럼의 기본값을 나타낼 수 있어요. |
NULL |
SELECT 목록에서 NULL을 정의해 NULL 컬럼을 나타낼 수 있어요. |
명명된 인자 (Named Arguments)
Flink SQL은 테이블 함수 호출 시 명명된 인자(named arguments)를 지원해요. 명명된 인자를 사용하면 함수의 공식 매개변수 이름을 사용해 값을 전달할 수 있어요.
call(f => COLOR, a => 1)
- 공식 매개변수
f에 이름COLOR, 매개변수a에 값1을 전달해요. - 명명된 인자와 위치 인자(positional arguments)를 혼합할 수 있어요. 단, 명명된 인자가 위치 인자 앞에 올 수 없어요.
- 명명된 인자의 순서는 자유로워요.
- 명명된 인자 이름은 대소문자를 구분하지 않아요.