대체 쿼리 언어(Alternative Query Languages)
대체 쿼리 언어(Alternative Query Languages)
표준 SQL 외에도 ClickHouse는 데이터를 조회하기 위한 다양한 대체 쿼리 언어를 지원합니다. 이 문서에서는 지원되는 언어들(PRQL, KQL, Trino)을 어떻게 활성화하고 사용하는지 설명할게요.
출처: 문서
본문
표준 SQL 외에도 ClickHouse는 데이터 조회를 위한 다양한 대체 쿼리 언어를 지원합니다. 현재 지원되는 방언(dialect)은 다음과 같습니다:
clickhouse: ClickHouse의 기본 SQL 방언prql: Pipelined Relational Query Language (PRQL)kusto: Kusto Query Language (KQL)trino: Trino SQL
어떤 쿼리 언어를 사용할지는 dialect 설정으로 제어합니다.
표준 SQL
표준 SQL은 ClickHouse의 기본 쿼리 언어입니다.
SET dialect = 'clickhouse'
파이프라인 관계형 쿼리 언어 (PRQL)
PRQL을 활성화하려면:
SET allow_experimental_prql_dialect = 1; -- 이 SET 문은 ClickHouse 버전 >= v25.1에서만 필요합니다
SET dialect = 'prql'
PRQL 쿼리 예시:
from trips
aggregate {
ct = count this
total_days = sum days
}
내부적으로 ClickHouse는 PRQL 쿼리를 실행하기 위해 PRQL을 SQL로 트랜스파일(transpile)합니다.
Kusto 쿼리 언어 (KQL)
KQL을 활성화하려면:
SET allow_experimental_kusto_dialect = 1; -- 이 SET 문은 ClickHouse 버전 >= 25.1에서만 필요합니다
SET dialect = 'kusto'
쿼리
numbers(10) | project number
응답
┌─number─┐
│ 0 │
│ 1 │
│ 2 │
│ 3 │
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└────────┘
KQL 쿼리는 ClickHouse에 정의된 모든 함수에 접근하지 못할 수 있다는 점에 유의하세요.
Trino SQL
Trino 방언을 활성화하려면:
SET enable_trino_dialect = 1;
SET dialect = 'trino'
Trino 고유 구문은 ClickHouse SQL로 번역되고, Trino 함수 이름은 ClickHouse의 대응 함수에 매핑됩니다:
쿼리
SELECT approx_distinct(x) FROM (VALUES 1, 2, 2) AS t(x)
응답
┌─uniq(x)─┐
│ 2 │
└─────────┘
번역은 무엇보다도 ARRAY[...] 리터럴, TRY_CAST, UNNEST(ARRAY JOIN으로 번역), ROW 생성자와 타입, VALUES 테이블, LIMIT 앞의 OFFSET, BETWEEN SYMMETRIC, 그리고 양쪽 시스템에 다른 의미로 존재하는 이름을 포함한 수백 개의 함수(예: Trino length는 Unicode 코드 포인트를 세며 lengthUTF8로 번역됨)를 다룹니다. Trino 이름과 충돌하지 않는 ClickHouse 함수는 계속 접근 가능하므로 두 함수 계열을 하나의 쿼리에서 혼합할 수 있습니다. Trino JSON 값은 ClickHouse JSON 타입에 매핑됩니다: JSON '...' 리터럴과 json_parse는 JSON으로의 캐스트가 되고, json_format은 toJSONString이 되며, 경로 함수들(json_extract, json_extract_scalar, json_value, json_query, json_exists, json_size)은 ClickHouse 대응 함수로 번역됩니다. ClickHouse JSON 타입은 객체를 저장하므로, 객체가 아닌 문서(최상위 배열과 스칼라)는 JSON 값으로 구체화될 때 거부됩니다. 경로 함수는 모든 JSON 텍스트를 받아들입니다. 일부 Trino 의미론은 번역된 쿼리 텍스트로 표현할 수 없어 대신 쿼리 컨텍스트에 적용됩니다: 외부 조인은 NULL을 생성하고(join_use_nulls), 집합 연산은 Variant 대신 숫자 슈퍼타입을 사용하며(use_variant_as_common_type), 쿼리 분석기가 필요합니다(enable_analyzer). 쿼리의 명시적 SETTINGS 절은 여전히 이들보다 우선합니다. 쿼리 수준의 번역으로 고칠 수 없는 의미론은 ClickHouse의 것을 유지합니다. 특히 나눗셈 연산자 /는 Trino에서 정수 나눗셈을 수행하지만 ClickHouse에서는 부동소수점 나눗셈을 하며, round는 Float 인자에 대해 ClickHouse에서 banker's rounding을 사용합니다. EXPLAIN SYNTAX를 사용해 쿼리가 어떻게 번역되는지 확인하세요.