Foundry SQL 문법과 함수 참조
Foundry SQL은 ANSI 규칙을 따르는 Spark SQL의 부분집합입니다. Furnace와 Ontology SQL이 공통 파싱 문법을 사용하지만 함수, 자료형과 쓰기 지원은 다릅니다. 객체 모드는 SELECT 조회만 지원하므로 아래 테이블 생성과 변경 문장은 Furnace의 표 데이터에 사용합니다.
문법 표기의 대괄호는 선택 항목, 중괄호 안의 세로줄은 대안, ...는 반복 가능 요소를 나타냅니다. 예시의 경로와 데이터 값은 설명용이며 실제 리소스와 스키마로 바꿉니다. 서로 다른 작업을 설명하는 예제들을 하나의 연속 실행 스크립트로 취급하지 않습니다.
자주 사용하는 문장
테이블 생성, 입력, 조회, 조인, 집계, 윈도 함수와 CTE의 기본 형태입니다.
-- Create a table
CREATE TABLE `/path/to/table` (id INT, name STRING);
-- Insert data
INSERT INTO `/path/to/table` VALUES (1, 'foo'), (2, 'bar');
-- Basic query
SELECT * FROM `/path/to/table` WHERE id = 1;
-- Join tables
SELECT a.*, b.name
FROM `/path/to/table1` a
LEFT JOIN `/path/to/table2` b ON a.id = b.id;
-- Aggregate
SELECT category, COUNT(*), AVG(price)
FROM `/path/to/products`
GROUP BY category
HAVING COUNT(*) > 10;
-- Window function
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) as rank
FROM `/path/to/employees`;
-- CTE (Common Table Expression)
WITH summary AS (
SELECT category, SUM(amount) as total
FROM `/path/to/sales`
GROUP BY category
)
SELECT * FROM summary WHERE total > 1000;
| 범주 | 대표 함수 |
|---|---|
| 집계 | count, sum, avg, min, max, count(DISTINCT col), collect_set |
| 문자열 | upper, lower, trim, concat, concat_ws, contains, split, substr |
| 날짜와 시간 | current_date, current_timestamp, date_add, date_diff, to_date, year, month, day |
| 수학 | abs, round, ceil, floor, pow, sqrt, mod |
| 배열 | array, array_contains, array_size, array_distinct, explode, flatten |
| 조건 | CASE WHEN, coalesce, nullif, regexp_like, regexp_extract |
| 윈도 | ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD |
이 목록이 모든 엔진에서 동일하게 지원된다는 뜻은 아닙니다. 아래 호환성 표에서 사용할 엔진의 열을 확인합니다.
테이블 생성
CREATE [ OR REPLACE ] TABLE table_identifier [ ( col_name1 col_type1, ... ) ] [ USING table_format ] [ PARTITIONED BY ( expr [, ...] ) ] [ TBLPROPERTIES ( 'key'='value' [, ...] ) ] [ AS select_statement ]
형식을 생략하면 Iceberg입니다. USING에 iceberg, parquet, avro를 지정할 수 있습니다. PARTITIONED BY는 Iceberg에만 지원하며 TBLPROPERTIES는 Iceberg 속성을 설정합니다.
-- examples
CREATE TABLE `/path/to/table` AS
SELECT *
FROM `/path/to/source`;
CREATE TABLE `/path/to/table` USING parquet AS
SELECT *
FROM `/path/to/source`;
CREATE TABLE `/path/to/table`
(
id INT,
name STRING
);
CREATE OR REPLACE TABLE `/path/to/table` (id INT, name STRING);
CREATE TABLE `/path/to/table` (id INT, ts TIMESTAMP)
PARTITIONED BY (days(ts));
CREATE TABLE `/path/to/table` (id INT)
TBLPROPERTIES ('write.format.default'='parquet');
CREATE TABLE `/path/to/table`
PARTITIONED BY (id)
AS SELECT * FROM `/path/to/source`;
행 추가, 수정과 삭제
INSERT, UPDATE와 DELETE는 Iceberg 테이블에서 지원합니다. 비Iceberg 테이블에는 이 행 변경 기능이 없습니다.
INSERT
VALUES로 값을 추가하거나 SELECT 결과를 삽입합니다.
INSERT [ INTO ] table_identifier { VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }
-- examples
INSERT INTO `/path/to/table` VALUES (1, 'foo'), (2, 'bar');
INSERT INTO `/path/to/table` SELECT id, name FROM `/path/to/table2`;
UPDATE
WHERE를 생략하면 모든 대상 행을 수정합니다. 제한할 조건을 확인하고 실행합니다.
UPDATE table_identifier
SET column_name = value [, ...]
[ WHERE condition ]
-- examples
UPDATE `/path/to/table`
SET col = 'new value';
UPDATE `/path/to/table`
SET col = 'new value'
WHERE col = 'old value';
DELETE
조건에 맞는 행을 삭제합니다.
DELETE FROM table_identifier WHERE condition
DELETE FROM `/path/to/table` WHERE col = 'to delete'
Iceberg 스키마와 메타데이터
열
열 추가, 삭제, 이름 변경, 자료형 변경, 설명과 null 제약의 설정 및 해제를 지원합니다.
ALTER TABLE table_identifier ADD COLUMN col_name col_type [COMMENT 'comment']
ALTER TABLE table_identifier ADD COLUMNS (col_name col_type [COMMENT 'comment'], ...)
ALTER TABLE table_identifier DROP COLUMN col_name
ALTER TABLE table_identifier DROP COLUMNS (col_name, ...)
ALTER TABLE table_identifier RENAME COLUMN old_name TO new_name
ALTER TABLE table_identifier ALTER COLUMN col_name TYPE new_type
ALTER TABLE table_identifier ALTER COLUMN col_name COMMENT 'comment'
ALTER TABLE table_identifier ALTER COLUMN col_name DROP NOT NULL
ALTER TABLE table_identifier ALTER COLUMN col_name SET NOT NULL
각 문장은 열과 스키마를 변경하는 별도의 예시입니다.
-- examples
ALTER TABLE `/path/to/table` ADD COLUMN new_col STRING;
ALTER TABLE `/path/to/table` ADD COLUMNS (col1 INT, col2 STRING COMMENT 'description');
ALTER TABLE `/path/to/table` DROP COLUMN old_col;
ALTER TABLE `/path/to/table` RENAME COLUMN old_name TO new_name;
ALTER TABLE `/path/to/table` ALTER COLUMN col2 TYPE BIGINT;
파티션 필드
파티션 식을 추가, 삭제하거나 교체하며 선택적으로 별칭을 지정합니다.
ALTER TABLE table_identifier ADD PARTITION FIELD expr [AS alias]
ALTER TABLE table_identifier DROP PARTITION FIELD expr
ALTER TABLE table_identifier REPLACE PARTITION FIELD old_expr WITH new_expr [AS alias]
-- examples
ALTER TABLE `/path/to/table` ADD PARTITION FIELD days(ts);
ALTER TABLE `/path/to/table` ADD PARTITION FIELD bucket(16, id) AS id_bucket;
ALTER TABLE `/path/to/table` DROP PARTITION FIELD days(ts);
ALTER TABLE `/path/to/table` REPLACE PARTITION FIELD days(ts) WITH hours(ts);
쓰기 정렬
전체 정렬, 로컬 정렬, 파티션별 분배와 선택적 로컬 정렬을 지정하거나 정렬을 해제할 수 있습니다.
ALTER TABLE table_identifier WRITE ORDERED BY col1 [ASC|DESC] [, ...]
ALTER TABLE table_identifier WRITE LOCALLY ORDERED BY col1 [ASC|DESC] [, ...]
ALTER TABLE table_identifier WRITE DISTRIBUTED BY PARTITION [LOCALLY ORDERED BY col1 [ASC|DESC] [, ...]]
ALTER TABLE table_identifier WRITE UNORDERED
-- examples
ALTER TABLE `/path/to/table` WRITE ORDERED BY col1, col2 DESC;
ALTER TABLE `/path/to/table` WRITE DISTRIBUTED BY PARTITION LOCALLY ORDERED BY col1;
ALTER TABLE `/path/to/table` WRITE UNORDERED;
식별 필드
테이블의 식별 필드를 지정하거나 해제합니다.
ALTER TABLE table_identifier SET IDENTIFIER FIELDS col1 [, ...]
ALTER TABLE table_identifier DROP IDENTIFIER FIELDS col1 [, ...]
-- examples
ALTER TABLE `/path/to/table` SET IDENTIFIER FIELDS col1, col2;
ALTER TABLE `/path/to/table` DROP IDENTIFIER FIELDS col1, col2;
테이블 속성
SET TBLPROPERTIES로 하나 이상의 속성을 지정하고 UNSET으로 제거합니다. 예시는 기본 파일 형식과 Parquet 압축을 구성합니다.
ALTER TABLE table_identifier SET TBLPROPERTIES ('key1'='value1' [, ...])
ALTER TABLE table_identifier UNSET TBLPROPERTIES ('key1' [, ...])
-- examples
ALTER TABLE `/path/to/table` SET TBLPROPERTIES ('write.format.default'='parquet');
ALTER TABLE `/path/to/table` SET TBLPROPERTIES ('write.format.default'='parquet', 'write.parquet.compression-codec'='zstd');
ALTER TABLE `/path/to/table` UNSET TBLPROPERTIES ('write.format.default');
스냅샷 태그
태그를 생성, 교체하거나 삭제할 수 있습니다. 스냅샷 버전과 보존 일수를 지정할 수 있으며 IF NOT EXISTS와 IF EXISTS 조건을 사용할 수 있습니다.
ALTER TABLE table_identifier CREATE TAG [IF NOT EXISTS] tag_name [AS OF VERSION snapshot_id] [RETAIN n DAYS]
ALTER TABLE table_identifier CREATE OR REPLACE TAG tag_name [AS OF VERSION snapshot_id] [RETAIN n DAYS]
ALTER TABLE table_identifier DROP TAG [IF EXISTS] tag_name
ALTER TABLE table_identifier REPLACE TAG tag_name [AS OF VERSION snapshot_id] [RETAIN n DAYS]
-- examples
ALTER TABLE `/path/to/table` CREATE TAG v1 AS OF VERSION 42;
ALTER TABLE `/path/to/table` CREATE TAG IF NOT EXISTS v1 AS OF VERSION 42 RETAIN 7 DAYS;
ALTER TABLE `/path/to/table` CREATE OR REPLACE TAG v2 AS OF VERSION 100;
ALTER TABLE `/path/to/table` DROP TAG IF EXISTS v1;
ALTER TABLE `/path/to/table` REPLACE TAG v1 AS OF VERSION 50 RETAIN 14 DAYS;
Iceberg 브랜치
테이블 브랜치를 생성, 교체하거나 삭제합니다. 시작 스냅샷, 브랜치 보존과 스냅샷 개수 및 기간을 지정할 수 있습니다. 이 테이블 참조는 코드 브랜치와 구분합니다.
ALTER TABLE table_identifier CREATE BRANCH [IF NOT EXISTS] branch_name [AS OF VERSION snapshot_id] [RETAIN n DAYS] [WITH SNAPSHOT RETENTION n SNAPSHOTS [n DAYS]]
ALTER TABLE table_identifier CREATE OR REPLACE BRANCH branch_name [AS OF VERSION snapshot_id] [RETAIN n DAYS] [WITH SNAPSHOT RETENTION n SNAPSHOTS [n DAYS]]
ALTER TABLE table_identifier DROP BRANCH [IF EXISTS] branch_name
ALTER TABLE table_identifier REPLACE BRANCH branch_name [AS OF VERSION snapshot_id] [RETAIN n DAYS]
-- examples
ALTER TABLE `/path/to/table` CREATE BRANCH feature_branch;
ALTER TABLE `/path/to/table` CREATE BRANCH IF NOT EXISTS my_branch AS OF VERSION 42 RETAIN 7 DAYS;
ALTER TABLE `/path/to/table` CREATE OR REPLACE BRANCH my_branch AS OF VERSION 10;
ALTER TABLE `/path/to/table` DROP BRANCH IF EXISTS old_branch;
ALTER TABLE `/path/to/table` REPLACE BRANCH my_branch AS OF VERSION 5 RETAIN 30 DAYS;
트랜잭션 블록
BEGIN과 COMMIT 사이 문장들은 하나의 원자적 실행 작업으로 묶습니다. 중첩할 수 없으며 쓰기 문장을 하나 이상 포함해야 합니다. 짝이 없는 BEGIN이나 COMMIT은 파싱 오류입니다.
BEGIN;
statement1;
statement2;
...
COMMIT;
테이블 생성과 입력을 묶거나 서로 다른 테이블의 입력을 한 실행으로 구성할 수 있습니다.
-- Create and populate a table atomically
BEGIN;
CREATE OR REPLACE TABLE `/path/to/table` (id INT, name STRING);
INSERT INTO `/path/to/table` VALUES (1, 'foo'), (2, 'bar');
COMMIT;
-- Multiple inserts into separate tables as a single job
BEGIN;
INSERT INTO `/path/to/table1` SELECT * FROM `/path/to/source`;
INSERT INTO `/path/to/table2` SELECT * FROM `/path/to/source`;
COMMIT;
쿼리 조합
WITH, 집합 연산 UNION/INTERSECT/EXCEPT, 정렬, 명명한 윈도와 제한을 조합합니다.
[ WITH with_query [ , ... ] ]
select_statement
[ { UNION | INTERSECT | EXCEPT } select_statement, ... ]
[ ORDER BY { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] } ]
[ WINDOW { window_name AS ( window_spec ) [, ...] } ]
[ LIMIT { ALL | expression } ]
공통 테이블 식
CTE 이름, 선택적 열 이름과 괄호 안 SELECT를 지정합니다.
cte_name [ ( column_name [, ...] ) ] AS ( select_statement )
-- examples
WITH sales_summary (cust_id, total_sales, order_count) AS (
SELECT customer_id, SUM(total_amount), COUNT(*)
FROM `/data/orders`
GROUP BY customer_id
)
SELECT * FROM sales_summary WHERE total_sales > 10000;
SELECT와 그룹화
SELECT [ ALL | DISTINCT ] { [ named_expression | regex_column_names | * ] [, ...] }
FROM { from_item [, ...] }
[ WHERE boolean_expression ]
[ GROUP BY { ALL | { expression | ROLLUP(...) | CUBE(...) | GROUPING SETS(...) } [ , ... ] } ]
[ HAVING boolean_expression ]
[ LIMIT { ALL | expression } [ OFFSET expression ] ]
Furnace의 GROUP BY ALL은 SELECT에 있는 비집계 식 전체를 그룹화합니다.
SELECT region, product, SUM(revenue)
FROM `/data/sales`
GROUP BY ALL;
선택 식에는 별칭을 붙일 수 있습니다.
expression [ AS alias ]
-- examples
SELECT count(*) AS total_count FROM `/path/to/table`;
SELECT name, salary * 1.1 AS adjusted_salary FROM `/path/to/employees`;
윈도 정의
OVER에 윈도 식을 직접 넣거나 WINDOW에서 정의한 이름을 참조합니다. PARTITION BY와 ORDER BY는 선택 항목입니다.
window_function() OVER ( window_spec )
window_function() OVER window_name
[ PARTITION BY expression [, ...] ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ]
-- examples
SELECT name, ROW_NUMBER() OVER (ORDER BY salary DESC) as rank
FROM `/path/to/employees`;
SELECT category, product_id,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) as category_rank
FROM `/path/to/products`;
-- Using named window
SELECT customer_id, order_date, total,
ROW_NUMBER() OVER w as order_sequence
FROM `/path/to/orders`
WINDOW w AS (PARTITION BY customer_id ORDER BY order_date);
FROM과 리소스 식별
파일시스템 경로나 RID를 백틱으로 감쌉니다.
-- By path
SELECT * FROM `/path/to/table`;
-- By RID
SELECT * FROM `ri.rid.for.table.1234`;
-- With branch
SELECT * FROM `/path/to/table`.branch_master;
Iceberg 브랜치를 조회할 때는 .branch_<branch name>을 붙일 수 있습니다. 특수 문자가 있는 브랜치 이름은 백틱으로 감쌉니다.
{ `/path/to/table`[.branch_<branch name>] | `ri.rid.for.table.1234`[.branch_<branch name>] }
-- examples
SELECT * FROM `/path/to/table`;
SELECT * FROM `/path/to/table`.branch_master;
SELECT * FROM `/path/to/table` WHERE id = 1;
SELECT * FROM `ri.rid.for.table.1234`;
SELECT * FROM `ri.rid.for.table`.`branch_abc\xyz`;
시간 이동
VERSION AS OF는 Iceberg의 스냅샷 ID 또는 Foundry 데이터셋의 트랜잭션 RID를 지정합니다.
-- Examples
SELECT * FROM `/path/to/table` VERSION AS OF `ri.foundry.main.transaction.1234`;
SELECT * FROM `/path/to/table` VERSION AS OF 1234567;
Foundry 데이터셋의 VERSION BETWEEN은 시작 트랜잭션을 제외하고 끝 트랜잭션까지 포함하여 그 사이에 추가된 행을 읽습니다. 두 경계 모두 트랜잭션 RID여야 합니다. Iceberg 스냅샷 ID를 사용할 수 없고 Iceberg 테이블에는 VERSION BETWEEN이 지원되지 않습니다. 이외 시간 이동 문법도 현재 지원하지 않습니다.
-- Rows appended after txn.1234, up to and including txn.5678
SELECT * FROM `/path/to/table`
VERSION BETWEEN `ri.foundry.main.transaction.1234` AND `ri.foundry.main.transaction.5678`;
조인
다른 관계와 CROSS, LEFT, RIGHT 또는 FULL OUTER 조인을 구성합니다.
relation
{ CROSS | LEFT [ OUTER ] | RIGHT [ OUTER ] | FULL [ OUTER ] }
JOIN relation
ON boolean_expression
-- examples
SELECT * FROM `/path/to/table` LEFT JOIN `/path/to/table2` ON id = id2;
SELECT * FROM `/path/to/table` RIGHT OUTER JOIN `/path/to/table2` ON id = id2;
하위 쿼리
Foundry에서는 하위 쿼리를 반드시 괄호로 감싸야 합니다. Spark에서 일부 생략 가능한 경우라도 이 규칙을 적용합니다.
( select_statement )
-- examples
SELECT * FROM (SELECT * FROM `/path/to/table`);
SELECT * FROM (SELECT * FROM `/path/to/table`) WHERE id = 1;
SELECT * FROM (
VALUES (9001, 1001, 1, DATE '2023-06-01', 'credit_card', 1329.98, 'completed',
TIMESTAMP '2023-06-01 11:00:00')
) AS orders(order_id, customer_id, product_id, order_date, payment_method, total, status, created_at);
복합 조회 예시
다음은 필터와 조인, HAVING 집계, 여러 조인을 포함한 UNION 예시입니다.
-- Complex query with joins and filtering
SELECT DISTINCT o.order_id,
c.name,
o.total_amount,
p.category
FROM `/data/orders` o
LEFT JOIN `/data/customers` c ON o.customer_id = c.id
CROSS JOIN (SELECT product_id, category
FROM `/data/products`
WHERE category = 'Electronics') p ON o.product_id = p.product_id
WHERE o.order_date > DATE '2024-01-01'
AND o.total_amount > 1000.0
ORDER BY o.total_amount DESC
LIMIT 100;
-- Aggregation with HAVING clause
SELECT c.name,
COUNT(o.order_id) as order_count,
SUM(o.total_amount) as total_spent
FROM `/data/customers` c
LEFT JOIN `/data/orders` o ON c.id = o.customer_id
GROUP BY c.name
HAVING COUNT(o.order_id) > 0;
-- UNION query with multiple joins
SELECT emp_id, name, dept, 'Active' AS status
FROM `/hr/employees` e
LEFT OUTER JOIN `/hr/departments` d ON e.dept_id = d.id
WHERE e.active = true
UNION
SELECT emp_id, name, dept, 'Inactive' AS status
FROM (SELECT *
FROM `/hr/employees`
WHERE termination_date < current_timestamp()) e
RIGHT JOIN `/hr/departments` d ON e.dept_id = d.id
WHERE e.active = false
ORDER BY dept ASC, status DESC NULLS LAST;
힌트와 메타데이터
힌트는 쿼리 엔진에 추가 지시를 제공합니다.
/*+ hint1, hint2(opts...) */
adhoc은 일회성 쓰기를 추가 정의로 남기되 활성 SQL 정의를 바꾸지 않을 때 사용합니다. CREATE OR REPLACE TABLE은 기존 정의를 교체하는 예외이므로 활성 정의를 보존할 보충 작업은 INSERT나 ALTER 같은 적절한 연산으로 구성합니다.
/*+ adhoc */
INSERT INTO `/path/to/table` SELECT * FROM `/path/to/source`;
Iceberg의 파일 및 스냅샷 메타데이터는 다음 참조로 조회할 수 있습니다.
-- examples
SELECT * FROM `/path/to/table/`.files;
SELECT * FROM `/path/to/table/`.snapshots;
SHOW FUNCTIONS는 name, kind와 signature를 반환합니다. kind는 scalar, aggregate, window 중 하나입니다. LIKE의 %는 임의 길이 문자열, _는 문자 하나와 일치합니다.
SHOW FUNCTIONS;
SHOW FUNCTIONS LIKE 'abs%';
함수와 연산자 지원
함수 예시의 table과 열은 실제 리소스 및 속성으로 치환합니다. 동일한 계산의 별칭도 엔진별 지원이 다를 수 있으므로 이름을 임의로 바꾸지 않습니다.
배열 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
array(expr, ...) | 지정 원소로 배열을 만듭니다. | SELECT array(1, 2, 3) | 지원 | 지원 |
array_distinct(array) | 배열에서 중복값을 제거합니다. | SELECT array_distinct(tags) FROM table | 지원 | 미지원 |
array_intersect(array1, array2) | 두 배열에 공통으로 있는 원소를 중복 없이 반환합니다. | SELECT array_intersect(arr1, arr2) FROM table | 지원 | 미지원 |
array_union(array1, array2) | 두 배열 중 하나에 있는 원소를 중복 없이 반환합니다. | SELECT array_union(arr1, arr2) FROM table | 지원 | 미지원 |
array_except(array1, array2) | 첫 배열에만 있는 원소를 반환합니다. | SELECT array_except(arr1, arr2) FROM table | 지원 | 미지원 |
array_join(array, delimiter [, nullReplacement]) | 구분자로 원소를 연결하며 null 대체 문자열을 선택할 수 있습니다. | SELECT array_join(tags, ',') FROM table | 지원 | 지원 |
array_max(array) | 배열의 최댓값을 반환합니다. | SELECT array_max(ARRAY(1, 5, 3)) | 지원 | 미지원 |
array_min(array) | 배열의 최솟값을 반환합니다. | SELECT array_min(ARRAY(1, 5, 3)) | 지원 | 미지원 |
array_position(array, element) | 처음 일치하는 위치를 1부터 세어 반환하며 없으면 0입니다. | SELECT array_position(tags, 'item') FROM table | 지원 | 미지원 |
array_remove(array, element) | 일치하는 모든 원소를 제거합니다. | SELECT array_remove(tags, 'old') FROM table | 지원 | 미지원 |
array_size(array) | 배열 원소 수를 반환합니다. | SELECT array_size(tags) FROM table | 지원 | 지원 |
array_contains(array, value) | 배열이 값을 포함하는지 반환합니다. | SELECT array_contains(tags, 'new') FROM table | 지원 | 지원 |
array_repeat(element, count) | 원소를 지정 횟수 반복한 배열을 만듭니다. | SELECT array_repeat('x', 5) | 지원 | 미지원 |
arrays_overlap(array1, array2) | 두 배열에 공통된 null 아닌 원소가 있는지 반환합니다. | SELECT arrays_overlap(arr1, arr2) FROM table | 지원 | 미지원 |
flatten(arrayOfArrays) | 중첩 배열을 한 배열로 펼칩니다. | SELECT flatten(nested_arrays) FROM table | 지원 | 미지원 |
sequence(start, stop, step) | 시작, 끝과 간격으로 정수 수열을 만듭니다. | SELECT sequence(1, 10, 2) | 지원 | 미지원 |
shuffle(array) | 배열 원소의 무작위 순열을 반환합니다. | SELECT shuffle(tags) FROM table | 지원 | 미지원 |
slice(array, start, length) | 시작 위치에서 지정 길이만큼 부분 배열을 반환합니다. | SELECT slice(tags, 1, 2) FROM table | 지원 | 미지원 |
sort_array(array[, ascendingOrder]) | 기본 오름차순 또는 지정한 내림차순으로 정렬합니다. | SELECT sort_array(tags) FROM table | 지원 | 미지원 |
array_sort(array) | 오름차순 정렬하며 null은 마지막에 둡니다. | SELECT array_sort(tags) FROM table | 지원 | 미지원 |
get(array, index) | 0부터 세는 위치의 원소를 반환합니다. | SELECT get(tags, 0) FROM table | 지원 | 지원 |
element_at(array, index) | 1부터 세는 위치의 원소를 반환하며 음수는 뒤에서 셉니다. | SELECT element_at(tags, 1) FROM table | 지원 | 미지원 |
size(array) | 배열 원소 수를 반환합니다. 맵에도 사용할 수 있습니다. | SELECT size(tags) FROM table | 지원 | 지원 |
cardinality(array) | 배열 원소 수를 반환합니다. 맵에도 사용할 수 있습니다. | SELECT cardinality(tags) FROM table | 지원 | 지원 |
explode(array) | 배열 원소마다 새 행을 만듭니다. | SELECT explode(tags) FROM table | 지원 | 지원 |
맵 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
map(key1, value1, key2, value2, ...) | 키와 값의 쌍으로 맵을 만듭니다. | SELECT map('a', 1, 'b', 2) | 지원 | 미지원 |
map_keys(map) | 맵 키의 배열을 반환합니다. | SELECT map_keys(attributes) FROM table | 지원 | 미지원 |
map_values(map) | 맵 값의 배열을 반환합니다. | SELECT map_values(attributes) FROM table | 지원 | 미지원 |
element_at(map, key) | 지정 키에 해당하는 값을 반환합니다. | SELECT element_at(attributes, 'color') FROM table | 지원 | 미지원 |
size(map) | 맵 항목 수를 반환합니다. 배열에도 사용할 수 있습니다. | SELECT size(attributes) FROM table | 지원 | 미지원 |
cardinality(map) | 맵 항목 수를 반환합니다. 배열에도 사용할 수 있습니다. | SELECT cardinality(attributes) FROM table | 지원 | 미지원 |
구조체 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
struct(expr1, expr2, ...) | 여러 식에서 구조체를 만듭니다. | SELECT struct('red', 'large', 2.0) | 지원 | 미지원 |
날짜와 타임스탬프 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
current_timestamp() | 현재 타임스탬프를 반환합니다. | SELECT current_timestamp() | 지원 | 지원 |
current_date() | 현재 날짜를 반환합니다. | SELECT current_date() | 지원 | 지원 |
now() | current_timestamp의 별칭입니다. | SELECT now() | 지원 | 미지원 |
add_months(date, num_months) | 날짜에 지정 개월을 더합니다. | add_months(order_date, 3) | 지원 | 미지원 |
date_add(expr, num_days) | 날짜에 지정 일수를 더합니다. | date_add(order_date, 7) | 지원 | 지원 |
date_format(expr, format) | 날짜 또는 타임스탬프를 지정 형식의 문자열로 만듭니다. | SELECT date_format(TIMESTAMP '2024-01-15 10:30:00', 'yyyy-MM-dd') | 지원 | 지원 |
date_sub(expr, num_days) | 날짜에서 지정 일수를 뺍니다. | date_sub(order_date, 7) | 지원 | 지원 |
from_unixtime(expr [, format]) | Unix 타임스탬프를 날짜와 시간 표현으로 변환합니다. | from_unixtime(1609459200) | 지원 | 미지원 |
unix_timestamp([expr] [, format]) | 입력 타임스탬프를 Unix 타임스탬프로 변환합니다. | unix_timestamp(current_timestamp()) | 지원 | 미지원 |
day(date) | 날짜의 일을 추출합니다. | SELECT day(order_date) FROM table | 지원 | 지원 |
hour(timestamp) | 타임스탬프의 시를 추출합니다. | SELECT hour(order_timestamp) FROM table | 지원 | 미지원 |
minute(timestamp) | 타임스탬프의 분을 추출합니다. | SELECT minute(order_timestamp) FROM table | 지원 | 미지원 |
month(date) | 날짜의 월을 추출합니다. | SELECT month(order_date) FROM table | 지원 | 지원 |
quarter(date) | 날짜의 분기를 추출합니다. | SELECT quarter(order_date) FROM table | 지원 | 지원 |
second(timestamp) | 타임스탬프의 초를 추출합니다. | SELECT second(order_timestamp) FROM table | 지원 | 미지원 |
year(date) | 날짜의 연도를 추출합니다. | SELECT year(order_date) FROM table | 지원 | 지원 |
date_trunc(unit, timestamp) | 타임스탬프를 지정 단위로 절삭합니다. | SELECT date_trunc('day', current_timestamp()) | 지원 | 미지원 |
trunc(date, fmt) | 날짜를 YEAR, QUARTER, MONTH 또는 WEEK 단위로 절삭합니다. | SELECT trunc(order_date, 'MM') | 지원 | 미지원 |
to_date(str [, format]) | 문자열을 날짜로 변환합니다. | SELECT to_date('2024-01-15') | 지원 | 미지원 |
to_timestamp(expr [, format]) | 입력을 타임스탬프로 변환합니다. | SELECT to_timestamp('2024-01-15 10:30:00') | 지원 | 미지원 |
timestamp(expr) | 타임스탬프의 짧은 형식 변환 문법입니다. | SELECT timestamp('2024-01-15 10:30:00') | 지원 | 미지원 |
from_utc_timestamp(ts, tz) | UTC 시각을 지정 시간대에서 해석합니다. | SELECT from_utc_timestamp(ts, 'America/Los_Angeles') | 지원 | 미지원 |
to_utc_timestamp(ts, tz) | 지정 시간대의 시각을 UTC로 변환합니다. | SELECT to_utc_timestamp(ts, 'America/Los_Angeles') | 지원 | 미지원 |
dayofmonth(date) | day의 별칭으로 날짜의 일을 추출합니다. | SELECT dayofmonth(order_date) FROM table | 지원 | 미지원 |
dayofweek(date) | 요일을 일요일 1부터 토요일 7까지 반환합니다. | SELECT dayofweek(order_date) FROM table | 지원 | 미지원 |
weekday(date) | 요일을 월요일 0부터 일요일 6까지 반환합니다. | SELECT weekday(order_date) FROM table | 지원 | 미지원 |
dayofyear(date) | 연중 일수를 1부터 366까지 반환합니다. | SELECT dayofyear(order_date) FROM table | 지원 | 미지원 |
weekofyear(date) | ISO 기준 연중 주 번호를 반환합니다. | SELECT weekofyear(order_date) FROM table | 지원 | 미지원 |
last_day(date) | 해당 월의 마지막 날짜를 반환합니다. | SELECT last_day(order_date) FROM table | 지원 | 미지원 |
next_day(start_date, day_of_week) | 시작 날짜 다음에 처음 나타나는 지정 요일의 날짜를 반환합니다. | SELECT next_day(order_date, 'Mon') FROM table | 지원 | 미지원 |
date_diff(date1, date2) | 두 날짜의 차이를 구합니다. | SELECT date_diff('2020-01-01', '2020-01-02') | 지원 | 지원 |
months_between(ts1, ts2 [, roundOff]) | 두 시각의 개월 차이를 소수로 반환합니다. roundOff가 false가 아니면 소수 여덟 자리로 반올림합니다. | SELECT months_between('1997-02-28 10:30:00', '1996-10-30') | 지원 | 미지원 |
timestamp_seconds(seconds) | UTC epoch 이후 초에서 타임스탬프를 만듭니다. 소수 초도 받습니다. | SELECT timestamp_seconds(1230219000) | 지원 | 미지원 |
timestamp_millis(millis) | UTC epoch 이후 밀리초에서 타임스탬프를 만듭니다. | SELECT timestamp_millis(1230219000123) | 지원 | 미지원 |
timestamp_micros(micros) | UTC epoch 이후 마이크로초에서 타임스탬프를 만듭니다. | SELECT timestamp_micros(1230219000123123) | 지원 | 미지원 |
unix_seconds(timestamp) | 1970-01-01 UTC 이후 초를 반환하며 더 세밀한 부분은 절삭합니다. | SELECT unix_seconds(current_timestamp()) | 지원 | 미지원 |
unix_millis(timestamp) | 1970-01-01 UTC 이후 밀리초를 반환하며 더 세밀한 부분은 절삭합니다. | SELECT unix_millis(current_timestamp()) | 지원 | 미지원 |
unix_micros(timestamp) | 1970-01-01 UTC 이후 마이크로초를 반환합니다. | SELECT unix_micros(current_timestamp()) | 지원 | 미지원 |
수학 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
abs(x) | 절댓값을 반환합니다. | SELECT abs(-5) | 지원 | 지원 |
acos(x) | 아크 코사인을 계산합니다. | SELECT acos(0.5) | 지원 | 미지원 |
asin(x) | 아크 사인을 계산합니다. | SELECT asin(0.5) | 지원 | 미지원 |
atan(x) | 아크 탄젠트를 계산합니다. | SELECT atan(1) | 지원 | 미지원 |
atan2(y, x) | y/x의 아크 탄젠트를 계산합니다. | SELECT atan2(1, 1) | 지원 | 미지원 |
cbrt(x) | 세제곱근을 계산합니다. | SELECT cbrt(27) | 지원 | 미지원 |
ceil(x) | 가까운 정수로 올림합니다. | SELECT ceil(3.7) | 지원 | 지원 |
ceiling(x) | 가까운 정수로 올림합니다. | SELECT ceiling(3.7) | 지원 | 지원 |
cos(x) | 코사인을 계산합니다. | SELECT cos(pi()) | 지원 | 미지원 |
cosh(x) | 쌍곡 코사인을 계산합니다. | SELECT cosh(0) | 지원 | 미지원 |
degrees(x) | 라디안을 도로 바꿉니다. | SELECT degrees(pi()) | 지원 | 미지원 |
e() | 자연상수 e를 반환합니다. | SELECT e() | 지원 | 미지원 |
exp(x) | e의 x승을 계산합니다. | SELECT exp(1) | 지원 | 미지원 |
floor(x) | 가까운 정수로 내림합니다. | SELECT floor(3.7) | 지원 | 지원 |
isnan(x) | NaN 여부를 반환하며 NULL 입력은 false입니다. | SELECT isnan(price) FROM table | 지원 | 미지원 |
nanvl(x, y) | x가 NaN이면 y, 아니면 x를 반환합니다. | SELECT nanvl(price, 0) FROM table | 지원 | 미지원 |
ln(x) | 자연로그를 계산합니다. | SELECT ln(e()) | 지원 | 미지원 |
log(base, x) | 지정 밑의 로그를 계산합니다. | SELECT log(2, 8) | 지원 | 미지원 |
log10(x) | 밑 10의 로그를 계산합니다. | SELECT log10(100) | 지원 | 미지원 |
log2(x) | 밑 2의 로그를 계산합니다. | SELECT log2(8) | 지원 | 미지원 |
mod(n, m) | 나눗셈의 나머지를 반환합니다. | SELECT mod(10, 3) | 지원 | 지원 |
pi() | 원주율을 반환합니다. | SELECT pi() | 지원 | 미지원 |
pow(x, p) | x의 p승을 계산합니다. | SELECT pow(2, 3) | 지원 | 미지원 |
power(x, p) | x의 p승을 계산합니다. | SELECT power(2, 3) | 지원 | 지원 |
radians(x) | 도를 라디안으로 바꿉니다. | SELECT radians(180) | 지원 | 미지원 |
rand([seed]) | 0과 1 사이 난수를 반환합니다. 선택적 seed는 Spark가 사용하지만 Trino는 무시합니다. | SELECT rand() | 지원 | 미지원 |
random([seed]) | 0과 1 사이 난수를 반환합니다. 선택적 seed는 Spark가 사용하지만 Trino는 무시합니다. | SELECT random() | 지원 | 미지원 |
round(x, d) | 소수 d자리로 반올림합니다. | SELECT round(3.7, 1) | 지원 | 지원 |
sign(x) | 부호를 -1, 0, 1로 반환합니다. | SELECT sign(-5) | 지원 | 미지원 |
sin(x) | 사인을 계산합니다. | SELECT sin(pi() / 2) | 지원 | 미지원 |
sinh(x) | 쌍곡 사인을 계산합니다. | SELECT sinh(0) | 지원 | 미지원 |
sqrt(x) | 제곱근을 계산합니다. | SELECT sqrt(16) | 지원 | 지원 |
tan(x) | 탄젠트를 계산합니다. | SELECT tan(pi() / 4) | 지원 | 미지원 |
tanh(x) | 쌍곡 탄젠트를 계산합니다. | SELECT tanh(0) | 지원 | 미지원 |
bin(x) | long 값을 이진 문자열로 표시합니다. 음수는 64비트 2의 보수 표현입니다. | SELECT bin(13) | 지원 | 미지원 |
문자열 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
chr(n) | 유니코드 코드 포인트의 문자를 반환합니다. | SELECT chr(65) | 지원 | 미지원 |
char(n) | chr의 별칭으로 코드 포인트의 문자를 반환합니다. | SELECT char(65) | 지원 | 미지원 |
contains(str, substr) | 부분 문자열 포함 여부를 반환합니다. | SELECT contains('hello', 'ell') | 지원 | 지원 |
concat_ws(sep, str1, ...) | 구분자로 문자열을 연결합니다. | SELECT concat_ws(',', 'a', 'b') | 지원 | 미지원 |
concat(str1, ...) | 문자열을 연결합니다. | SELECT concat('a', 'b') | 지원 | 지원 |
length(str) | 문자 수를 반환합니다. | SELECT length('hello') | 지원 | 지원 |
len(str) | length의 별칭이며 문자열 또는 이진 데이터를 받습니다. | SELECT len('hello') | 지원 | 미지원 |
char_length(str) | length의 별칭입니다. | SELECT char_length('hello') | 지원 | 지원 |
character_length(str) | length의 별칭입니다. | SELECT character_length('hello') | 지원 | 지원 |
bit_length(expr) | 문자열 또는 이진 데이터의 비트 수입니다. 문자열은 UTF-8 바이트 수의 8배입니다. | SELECT bit_length('Spark SQL') | 지원 | 미지원 |
octet_length(expr) | 문자열의 UTF-8 바이트 수 또는 이진 데이터 바이트 수를 반환합니다. | SELECT octet_length('Spark SQL') | 지원 | 미지원 |
format_number(num, places_or_format) | 소수 자릿수 또는 지정한 decimal-format 패턴으로 숫자를 표시합니다. | SELECT format_number(12332.123456, 4) | 지원 | 미지원 |
lower(str) | 소문자로 바꿉니다. | SELECT lower('HELLO') | 지원 | 지원 |
lcase(str) | lower의 별칭입니다. | SELECT lcase('HELLO') | 지원 | 미지원 |
upper(str) | 대문자로 바꿉니다. | SELECT upper('hello') | 지원 | 지원 |
ucase(str) | upper의 별칭입니다. | SELECT ucase('hello') | 지원 | 미지원 |
initcap(str) | 각 단어의 첫 글자를 대문자로 바꿉니다. | SELECT initcap('hello world') | 지원 | 미지원 |
lpad(str, len, pad) | 지정 길이가 되도록 왼쪽을 채웁니다. | SELECT lpad('hi', 5, 'x') | 지원 | 미지원 |
rpad(str, len, pad) | 지정 길이가 되도록 오른쪽을 채웁니다. | SELECT rpad('hi', 5, 'x') | 지원 | 미지원 |
ltrim(str) | 앞 공백을 제거합니다. | SELECT ltrim(' hello') | 지원 | 미지원 |
rtrim(str) | 뒤 공백을 제거합니다. | SELECT rtrim('hello ') | 지원 | 미지원 |
trim(str) | 앞뒤 공백을 제거합니다. | SELECT trim(' hello ') | 지원 | 지원 |
replace(str, search, replace) | 일치하는 모든 문자열을 대체합니다. | SELECT replace('hello', 'l', 'x') | 지원 | 지원 |
reverse(str) | 문자열 순서를 뒤집습니다. 배열에도 사용할 수 있습니다. | SELECT reverse('hello') | 지원 | 미지원 |
right(str, len) | 오른쪽 끝의 len개 문자를 반환합니다. | SELECT right('hello', 3) | 지원 | 미지원 |
substr(str, pos, len) | 지정 위치와 길이의 부분 문자열을 반환합니다. | SELECT substr('hello', 2, 3) | 지원 | 지원 |
substring(str, pos, len) | 지정 위치와 길이의 부분 문자열을 반환합니다. | SELECT substring('hello', 2, 3) | 지원 | 지원 |
substring_index(str, delim, count) | 구분자가 지정 횟수 나타나기 전의 부분을 반환합니다. 음수는 뒤에서 셉니다. | SELECT substring_index('a.b.c.d', '.', 2) | 지원 | 미지원 |
split(str, delimiter) | 문자열을 구분자로 나누어 배열로 반환합니다. | SELECT split('a,b,c', ',') | 지원 | 미지원 |
split_part(str, delimiter, index) | 구분한 문자열의 지정 부분을 1부터 세어 반환합니다. | SELECT split_part('a,b,c', ',', 2) | 지원 | 미지원 |
instr(str, substr) | 부분 문자열 위치를 1부터 세어 반환하며 없으면 0입니다. | SELECT instr('hello', 'll') | 지원 | 미지원 |
locate(substr, str [, pos]) | pos부터 부분 문자열을 찾습니다. 위치는 1부터 세며 없으면 0입니다. | SELECT locate('ll', 'hello') | 지원 | 미지원 |
position(substr IN str) | SQL 표준 문법으로 부분 문자열 위치를 찾습니다. | SELECT position('ll' IN 'hello') | 지원 | 미지원 |
startswith(str, prefix) | 지정 접두사로 시작하는지 반환합니다. | SELECT startswith('hello', 'he') | 지원 | 지원 |
luhn_check(str) | Luhn 알고리즘으로 문자열을 검사합니다. | SELECT luhn_check('79927398713') | 지원 | 미지원 |
조건 및 정규표현식 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
coalesce(expr1, expr2, ...) | 처음 나타나는 null 아닌 식을 반환합니다. | SELECT coalesce(col, 'default') | 지원 | 지원 |
nullif(expr1, expr2) | 두 식이 같으면 null, 아니면 첫 식을 반환합니다. | SELECT 100.0 / nullif(count, 0) | 지원 | 지원 |
if(cond, then, else) | 조건이 참이면 then, 아니면 else를 반환합니다. 객체 모드에서는 CASE WHEN을 사용합니다. | SELECT if(price > 100, 'high', 'low') | 지원 | 미지원 |
nvl(expr1, expr2) | 첫 식이 null이면 두 번째 식, 아니면 첫 식을 반환합니다. | SELECT nvl(col, 'default') | 지원 | 미지원 |
ifnull(expr1, expr2) | nvl의 별칭입니다. | SELECT ifnull(col, 'default') | 지원 | 미지원 |
nvl2(expr1, expr2, expr3) | 첫 식이 null이 아니면 두 번째, null이면 세 번째 식을 반환합니다. | SELECT nvl2(col, 'present', 'missing') | 지원 | 미지원 |
greatest(expr1, expr2, ...) | null을 제외한 최댓값이며 모든 입력이 null일 때만 null입니다. | SELECT greatest(a, b, c) FROM table | 지원 | 지원 |
least(expr1, expr2, ...) | null을 제외한 최솟값이며 모든 입력이 null일 때만 null입니다. | SELECT least(a, b, c) FROM table | 지원 | 지원 |
regexp_like(str, pattern) | 정규표현식 일치 여부를 반환합니다. | SELECT regexp_like('hello123', '[0-9]+') | 지원 | 미지원 |
regexp_extract(str, pattern) | 처음 일치한 부분 문자열을 추출합니다. | SELECT regexp_extract('hello123', '[0-9]+') | 지원 | 지원 |
regexp_extract_all(str, pattern) | 일치한 모든 부분 문자열을 추출합니다. | SELECT regexp_extract_all('a1b2c3', '[0-9]+') | 지원 | 미지원 |
regexp_replace(str, pattern, replacement) | 정규표현식에 일치하는 부분을 대체합니다. | SELECT regexp_replace('hello123', '[0-9]+', 'X') | 지원 | 지원 |
regexp_count(str, pattern) | 정규표현식 일치 횟수를 셉니다. | SELECT regexp_count('a1b2c3', '[0-9]+') | 지원 | 미지원 |
rlike(str, regexp) | Java 정규표현식의 부분 일치 여부를 반환합니다. | SELECT rlike('hello123', '\\d+') | 지원 | 미지원 |
regexp(str, regexp) | rlike의 별칭입니다. | SELECT regexp('hello123', '\\d+') | 지원 | 미지원 |
해시 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
md5(expr) | MD5 128비트 체크섬을 소문자 16진 문자열로 반환합니다. | SELECT md5('Spark') | 지원 | 미지원 |
sha(expr) | sha1의 별칭으로 SHA-1 해시를 16진 문자열로 반환합니다. | SELECT sha('Spark') | 지원 | 미지원 |
sha1(expr) | SHA-1 해시를 16진 문자열로 반환합니다. | SELECT sha1('Spark') | 지원 | 미지원 |
sha2(expr, bitLength) | SHA-2의 224, 256, 384, 512비트를 지원합니다. 0은 256이며 잘못된 비트 길이는 null입니다. | SELECT sha2('Spark', 256) | 지원 | 미지원 |
crc32(expr) | CRC32 체크섬을 BIGINT로 반환합니다. | SELECT crc32('Spark') | 지원 | 미지원 |
xxhash64(expr) | seed 42의 xxHash64 체크섬을 BIGINT로 반환합니다. | SELECT xxhash64('Spark') | 지원 | 미지원 |
자료형 변환
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
cast(expr AS type) | 지정 자료형으로 변환합니다. | cast(count() AS float) | 지원 | 지원 |
try_cast(expr AS type) | 지정 자료형으로 변환하고 실패하면 NULL을 반환합니다. | try_cast('abc' AS int) | 지원 | 미지원 |
집계 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
count() | 전체 행 수를 셉니다. | SELECT count() FROM table | 지원 | 지원 |
count(DISTINCT col) | 열의 서로 다른 값 수를 셉니다. | SELECT count(DISTINCT id) FROM table | 지원 | 단일 속성일 때 지원 |
approx_count_distinct(col) | HyperLogLog로 서로 다른 값 수를 근사합니다. | SELECT approx_count_distinct(id) FROM table | 지원 | 미지원 |
sum(col) | 열 값의 합계입니다. | SELECT sum(cost) FROM table | 지원 | 지원 |
avg(col) | 산술 평균입니다. | SELECT avg(weight) FROM table | 지원 | 지원 |
mean(col) | avg의 별칭입니다. | SELECT mean(weight) FROM table | 지원 | 미지원 |
min(col) | 열의 최솟값입니다. | SELECT min(price) FROM table | 지원 | 지원 |
max(col) | 열의 최댓값입니다. | SELECT max(price) FROM table | 지원 | 지원 |
min_by(x, y) | y가 최소인 행에 대응하는 x입니다. | SELECT min_by(name, age) FROM table | 지원 | 미지원 |
max_by(x, y) | y가 최대인 행에 대응하는 x입니다. | SELECT max_by(name, age) FROM table | 지원 | 미지원 |
first(col[, ignoreNulls]) | 그룹의 첫 값이며 반환값은 항상 nullable입니다. ignoreNulls를 지정할 수 있습니다. | SELECT first(name) FROM table GROUP BY category | 지원 | 미지원 |
last(col[, ignoreNulls]) | 그룹의 마지막 값이며 반환값은 항상 nullable입니다. ignoreNulls를 지정할 수 있습니다. | SELECT last(name) FROM table GROUP BY category | 지원 | 미지원 |
count_if(condition) | 조건이 참인 행 수를 셉니다. | SELECT count_if(age > 18) FROM table | 지원 | 미지원 |
bool_and(condition) | 모든 값이 참인지 반환합니다. | SELECT bool_and(active) FROM table | 지원 | 미지원 |
bool_or(condition) | 하나 이상의 값이 참인지 반환합니다. | SELECT bool_or(active) FROM table | 지원 | 미지원 |
bit_and(col) | null 아닌 정수 값들의 비트 AND입니다. | SELECT bit_and(flags) FROM table | 지원 | 미지원 |
bit_or(col) | null 아닌 정수 값들의 비트 OR입니다. | SELECT bit_or(flags) FROM table | 지원 | 미지원 |
bit_xor(col) | null 아닌 정수 값들의 비트 XOR입니다. | SELECT bit_xor(flags) FROM table | 지원 | 미지원 |
every(condition) | bool_and의 별칭입니다. | SELECT every(active) FROM table | 지원 | 미지원 |
stddev(col) | 표본 표준편차입니다. | SELECT stddev(salary) FROM table | 지원 | 지원 |
stddev_pop(col) | 모집단 표준편차입니다. | SELECT stddev_pop(salary) FROM table | 지원 | 지원 |
stddev_samp(col) | stddev의 별칭인 표본 표준편차입니다. | SELECT stddev_samp(salary) FROM table | 지원 | 지원 |
variance(col) | 표본 분산입니다. | SELECT variance(salary) FROM table | 지원 | 미지원 |
var_pop(col) | 모집단 분산입니다. | SELECT var_pop(salary) FROM table | 지원 | 미지원 |
var_samp(col) | 표본 분산입니다. | SELECT var_samp(salary) FROM table | 지원 | 미지원 |
corr(y, x) | 피어슨 상관계수입니다. | SELECT corr(sales, ads) FROM table | 지원 | 미지원 |
covar_pop(y, x) | 모집단 공분산입니다. | SELECT covar_pop(y, x) FROM table | 지원 | 미지원 |
covar_samp(y, x) | 표본 공분산입니다. | SELECT covar_samp(y, x) FROM table | 지원 | 미지원 |
skewness(col) | 왜도입니다. | SELECT skewness(values) FROM table | 지원 | 미지원 |
regr_intercept(y, x) | 선형 회귀의 절편입니다. | SELECT regr_intercept(y, x) FROM table | 지원 | 미지원 |
regr_slope(y, x) | 선형 회귀의 기울기입니다. | SELECT regr_slope(y, x) FROM table | 지원 | 미지원 |
grouping(col) | ROLLUP/CUBE/GROUPING SETS에서 해당 열이 집계되었으면 1, 아니면 0입니다. | SELECT grouping(category) FROM table GROUP BY ROLLUP(category) | 지원 | 미지원 |
collect_set(col) | 중복 없는 값의 배열을 반환합니다. | SELECT collect_set(name) FROM table GROUP BY category | 지원 | 미지원 |
collect_list(col) | 중복을 유지한 모든 값의 배열을 반환합니다. | SELECT collect_list(name) FROM table GROUP BY category | 지원 | 미지원 |
percentile(col, p[, freq]) | p가 지정한 정확한 백분위수를 계산합니다. p는 단일 값 또는 배열이고 freq를 선택할 수 있습니다. | SELECT percentile(salary, 0.5) FROM table | 지원 | 미지원 |
percentile_approx(col, p[, accuracy]) | 근사 백분위수를 계산하며 숫자, 날짜, 타임스탬프와 interval의 입력 자료형을 유지합니다. | SELECT percentile_approx(salary, ARRAY(0.25, 0.5, 0.75)) FROM table | 지원 | 미지원 |
approx_percentile(col, p[, accuracy]) | percentile_approx의 별칭입니다. | SELECT approx_percentile(salary, 0.5) FROM table | 지원 | 미지원 |
윈도 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
ROW_NUMBER() | 파티션 안에서 순서대로 행 번호를 붙입니다. | ROW_NUMBER() OVER (ORDER BY col) | 지원 | 지원 |
RANK() | 동률 다음 순위에 간격이 생기는 순위입니다. | RANK() OVER (ORDER BY salary DESC) | 지원 | 지원 |
DENSE_RANK() | 동률 다음 순위에 간격이 없는 순위입니다. | DENSE_RANK() OVER (ORDER BY salary DESC) | 지원 | 지원 |
PERCENT_RANK() | 그룹 안의 백분율 순위입니다. | PERCENT_RANK() OVER (ORDER BY salary) | 지원 | 미지원 |
CUME_DIST() | 누적 분포입니다. | CUME_DIST() OVER (ORDER BY salary) | 지원 | 미지원 |
NTILE(n) | 행을 n개 버킷으로 나눕니다. | NTILE(4) OVER (ORDER BY salary) | 지원 | 미지원 |
LAG(expr[, offset[, default]]) | 앞선 행의 값을 가져옵니다. offset과 기본값을 지정할 수 있습니다. | LAG(salary, 1) OVER (ORDER BY date) | 지원 | 지원 |
LEAD(expr[, offset[, default]]) | 다음 행의 값을 가져옵니다. offset과 기본값을 지정할 수 있습니다. | LEAD(salary, 1) OVER (ORDER BY date) | 지원 | 지원 |
FIRST_VALUE(expr) | 윈도 프레임의 첫 값입니다. | FIRST_VALUE(salary) OVER (ORDER BY date) | 지원 | 지원 |
LAST_VALUE(expr) | 윈도 프레임의 마지막 값입니다. | LAST_VALUE(salary) OVER (ORDER BY date) | 지원 | 지원 |
NTH_VALUE(expr, n) | 윈도 프레임의 n번째 값입니다. | NTH_VALUE(salary, 2) OVER (ORDER BY date) | 지원 | 지원 |
| 집계 함수 | 표준 집계를 윈도 함수로 사용할 수 있습니다. 객체 모드는 count, sum, min, max, avg로 제한됩니다. | SUM(amount) OVER (PARTITION BY customer_id) | 지원 | count, sum, min, max, avg만 지원 |
윈도 함수는 OVER가 필요하며 선택적으로 파티션과 정렬을 지정합니다. 다음은 행 번호, 그룹별 순위, 누적 합계와 이름 있는 윈도입니다.
-- examples
SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) as row_num
FROM `/path/to/table`;
SELECT category, name, price,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) as rank_in_category
FROM `/path/to/products`;
SELECT order_id, customer_id, order_date, total_amount,
SUM(total_amount) OVER (PARTITION BY customer_id ORDER BY order_date) as running_total,
AVG(total_amount) OVER (PARTITION BY customer_id) as customer_avg,
COUNT(*) OVER (PARTITION BY customer_id) as customer_order_count
FROM `/path/to/orders`;
SELECT id, amount,
ROW_NUMBER() OVER w as sequence_num
FROM `/path/to/transactions`
WINDOW w AS (PARTITION BY customer_id ORDER BY transaction_date);
JSON 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
get_json_object(json_str, path) | JSONPath로 JSON 문자열의 값을 추출합니다. | SELECT get_json_object('{"a":1}', '$.a') | 지원 | 미지원 |
json_array_length(json_str) | JSON 배열의 원소 수를 반환합니다. | SELECT json_array_length('[1,2,3]') | 지원 | 미지원 |
json_object_keys(json_str) | JSON 객체 키를 배열로 반환합니다. | SELECT json_object_keys('{"a":1,"b":2}') | 지원 | 미지원 |
to_json(expr) | 구조체 또는 맵을 JSON 문자열로 변환합니다. | SELECT to_json(map('a', 1)) | 지원 | 미지원 |
기타 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
zorder() | Iceberg에서 Z-order 최적화를 수행합니다. | CALL zorder('table', 'col1,col2') | 지원 | 미지원 |
typeof(expr) | 식의 런타임 자료형 이름을 반환합니다. | SELECT typeof(price) FROM table | 지원 | 미지원 |
공간 함수
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
st_point(x, y) | X, Y 좌표로 점 지오메트리를 만듭니다. | SELECT st_point(-122.4, 37.8) | 지원 | 미지원 |
st_contains(geom1, geom2) | 첫 지오메트리가 두 번째를 포함하는지 반환합니다. | WHERE st_contains(boundary, location) | 지원 | 미지원 |
st_equals(geom1, geom2) | 두 지오메트리가 공간적으로 같은지 반환합니다. | SELECT st_equals(point1, point2) | 지원 | 미지원 |
st_geomfromgeojson(json) | GeoJSON 문자열에서 지오메트리를 만듭니다. | SELECT st_geomfromgeojson('{"type":"Point","coordinates":[0,0]}') | 지원 | 미지원 |
st_astext(geom) | 지오메트리를 WKT 문자열로 반환합니다. | SELECT st_astext(st_point(0, 0)) | 지원 | 미지원 |
st_h3cellids(geom, level, fullCover) | 지오메트리를 덮는 H3 셀 배열을 반환합니다. | SELECT st_h3cellids(st_point(0, 0), 8, true) | 지원 | 미지원 |
지오메트리 열을 직접 반환할 수는 없습니다. 반환할 때는 st_astext()로 WKT 문자열로 변환합니다.
산술 연산자
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
+ | 덧셈입니다. | SELECT count() + 5 | 지원 | 지원 |
- | 뺄셈입니다. | SELECT count() - 1 | 지원 | 지원 |
* | 곱셈입니다. | SELECT sum(weight * 2) | 지원 | 지원 |
/ | 나눗셈입니다. | SELECT (avg(a) + avg(b)) / 2 | 지원 | 지원 |
불리언 연산자
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
= | 같음을 비교합니다. | WHERE id = 1 | 지원 | 지원 |
<>, != | 같지 않음을 비교합니다. | WHERE status <> 'inactive' | 지원 | 지원 |
< | 작음을 비교합니다. | WHERE age < 18 | 지원 | 지원 |
<= | 작거나 같음을 비교합니다. | WHERE price <= 100.0 | 지원 | 지원 |
> | 큼을 비교합니다. | WHERE salary > 50000 | 지원 | 지원 |
>= | 크거나 같음을 비교합니다. | WHERE score >= 90 | 지원 | 지원 |
AND | 논리 AND입니다. | WHERE active = true AND verified = true | 지원 | 지원 |
OR | 논리 OR입니다. | WHERE status = 'new' OR status = 'pending' | 지원 | 지원 |
NOT | 논리 NOT입니다. | WHERE NOT deleted | 지원 | 지원 |
IN | 목록의 값에 속하는지 비교합니다. | WHERE category IN ('A', 'B', 'C') | 지원 | 지원 |
LIKE | 문자열 패턴을 비교합니다. | WHERE name LIKE 'John%' | 지원 | 지원 |
RLIKE, REGEXP | Java 정규표현식의 부분 일치이며 NOT RLIKE로 부정할 수 있습니다. | WHERE name RLIKE '^[A-Z].*' | 지원 | 미지원 |
EXISTS | 하위 쿼리가 행을 반환하는지 확인합니다. | WHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.id) | 지원 | 지원 |
기타 식
| 함수 또는 연산자 | 동작 | 예시 | Furnace | Ontology SQL |
|---|---|---|---|---|
CASE ... WHEN | 조건별 결과를 선택합니다. | SELECT CASE WHEN mark >= 70 THEN 'A' WHEN mark >= 60 THEN 'B' ELSE 'C' END | 지원 | 지원 |
INTERVAL | 시간 간격 리터럴입니다. | SELECT order_date + INTERVAL 30 DAY, WHERE created_at > current_timestamp() - INTERVAL 1 HOUR | 지원 | 미지원 |
Ontology SQL의 조건 분기는 IF 대신 CASE WHEN을 사용합니다.
CASE WHEN condition THEN result
[WHEN condition THEN result]
[ELSE result]
END
시간 간격
Furnace는 연월 및 일시분초 간격 리터럴을 지원합니다. YEAR TO MONTH는 연도와 월 부분을 함께 표현합니다.
INTERVAL { yearMonthIntervalQualifier | dayTimeIntervalQualifier }
yearMonthIntervalQualifier
{ YEAR [TO MONTH] |
MONTH }
dayTimeIntervalQualifier
{ DAY [TO { HOUR | MINUTE | SECOND } ] |
HOUR [TO { MINUTE | SECOND } ] |
MINUTE [TO SECOND] |
SECOND }
-- examples
INTERVAL '1' YEAR
INTERVAL '6' MONTH
INTERVAL '25' DAY
INTERVAL '6-0' YEAR TO MONTH
자료형
| 자료형 | Spark 대응 | Furnace | Ontology SQL |
|---|---|---|---|
BOOLEAN | BOOLEAN | 지원 | 지원 |
SHORT | SHORT | 지원 | 지원 |
INT | INT | 지원 | 지원 |
LONG | LONG | 지원 | 지원 |
FLOAT | FLOAT | 지원 | 지원 |
DOUBLE | DOUBLE | 지원 | 지원 |
DATE | DATE | 지원 | 지원 |
TIMESTAMP | TIMESTAMP | 지원 | 지원 |
TIMESTAMP_NTZ | TIMESTAMP_NTZ | 지원 | 지원 |
STRING | STRING | 지원 | 지원 |
BINARY | BINARY | 지원 | 미지원 |
DECIMAL | DECIMAL | 지원 | 지원 |
MAP<key, value> | MAP<key, value> | 지원 | 미지원 |
ARRAY<element_type> | ARRAY<element_type> | 지원 | 지원 |
STRUCT<field1_name: field1_type, field2_name: field2_type, …> | STRUCT<field1_name: field1_type, field2_name: field2_type, …> | 지원 | 지원 |
다음 표 생성 예시는 각 자료형의 선언 형태를 보여 줍니다. 특정 형식 및 엔진의 지원 범위는 위 표와 해당 테이블의 조건을 함께 적용합니다.
CREATE TABLE `/path/to/table` (
col1 BOOLEAN,
col2 SHORT,
col3 INT,
col4 LONG,
col5 FLOAT,
col6 DOUBLE,
col7 DATE,
col8 TIMESTAMP,
col9 TIMESTAMP_NTZ,
col10 STRING,
col11 BINARY,
col12 DECIMAL(10, 2),
col13 MAP<STRING, STRING>,
col14 ARRAY<STRING>,
col15 STRUCT<col1: STRING, col2: STRING>
);