Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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과 열은 실제 리소스 및 속성으로 치환합니다. 동일한 계산의 별칭도 엔진별 지원이 다를 수 있으므로 이름을 임의로 바꾸지 않습니다.

배열 함수

함수 또는 연산자동작예시FurnaceOntology 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지원지원

맵 함수

함수 또는 연산자동작예시FurnaceOntology 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지원미지원

구조체 함수

함수 또는 연산자동작예시FurnaceOntology SQL
struct(expr1, expr2, ...)여러 식에서 구조체를 만듭니다.SELECT struct('red', 'large', 2.0)지원미지원

날짜와 타임스탬프 함수

함수 또는 연산자동작예시FurnaceOntology 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())지원미지원

수학 함수

함수 또는 연산자동작예시FurnaceOntology 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)지원미지원

문자열 함수

함수 또는 연산자동작예시FurnaceOntology 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')지원미지원

조건 및 정규표현식 함수

함수 또는 연산자동작예시FurnaceOntology 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+')지원미지원

해시 함수

함수 또는 연산자동작예시FurnaceOntology 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')지원미지원

자료형 변환

함수 또는 연산자동작예시FurnaceOntology SQL
cast(expr AS type)지정 자료형으로 변환합니다.cast(count() AS float)지원지원
try_cast(expr AS type)지정 자료형으로 변환하고 실패하면 NULL을 반환합니다.try_cast('abc' AS int)지원미지원

집계 함수

함수 또는 연산자동작예시FurnaceOntology 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지원미지원

윈도 함수

함수 또는 연산자동작예시FurnaceOntology 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 함수

함수 또는 연산자동작예시FurnaceOntology 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))지원미지원

기타 함수

함수 또는 연산자동작예시FurnaceOntology SQL
zorder()Iceberg에서 Z-order 최적화를 수행합니다.CALL zorder('table', 'col1,col2')지원미지원
typeof(expr)식의 런타임 자료형 이름을 반환합니다.SELECT typeof(price) FROM table지원미지원

공간 함수

함수 또는 연산자동작예시FurnaceOntology 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 문자열로 변환합니다.

산술 연산자

함수 또는 연산자동작예시FurnaceOntology SQL
+덧셈입니다.SELECT count() + 5지원지원
-뺄셈입니다.SELECT count() - 1지원지원
*곱셈입니다.SELECT sum(weight * 2)지원지원
/나눗셈입니다.SELECT (avg(a) + avg(b)) / 2지원지원

불리언 연산자

함수 또는 연산자동작예시FurnaceOntology 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, REGEXPJava 정규표현식의 부분 일치이며 NOT RLIKE로 부정할 수 있습니다.WHERE name RLIKE '^[A-Z].*'지원미지원
EXISTS하위 쿼리가 행을 반환하는지 확인합니다.WHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.id)지원지원

기타 식

함수 또는 연산자동작예시FurnaceOntology 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 대응FurnaceOntology SQL
BOOLEANBOOLEAN지원지원
SHORTSHORT지원지원
INTINT지원지원
LONGLONG지원지원
FLOATFLOAT지원지원
DOUBLEDOUBLE지원지원
DATEDATE지원지원
TIMESTAMPTIMESTAMP지원지원
TIMESTAMP_NTZTIMESTAMP_NTZ지원지원
STRINGSTRING지원지원
BINARYBINARY지원미지원
DECIMALDECIMAL지원지원
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>
);