데이터 타입
데이터 타입 (Data types)
Trino에는 아래에 설명된 내장 데이터 타입 집합이 있어요. 추가 타입은 플러그인이 제공할 수 있어요.
출처: 문서
본문
Trino에는 아래에 설명된 내장 데이터 타입 집합이 있고, 추가 타입은 플러그인이 제공할 수 있어요.
Trino 타입 지원과 매핑 (Trino type support and mapping)
데이터 소스에 대한 커넥터가 이 페이지에 설명된 모든 Trino 데이터 타입을 지원할 필요는 없어요. 데이터 소스에서 Trino와 유사한 데이터 타입이 사용된다면, 커넥터는 필요에 따라 Trino 타입과 원격 데이터 타입을 서로 매핑할 수 있어요.
커넥터와 데이터 소스에 따라 타입 매핑은 다음과 같이 양방향으로 적용될 수 있어요.
- 데이터 소스 → Trino 매핑: Trino가 데이터 소스의 컬럼을 읽는 모든 연산(예: SELECT 문장)에 적용돼요. 기반 소스 데이터 타입을 Trino 데이터 타입으로 표현해야 하거든요.
- Trino → 데이터 소스 매핑: Trino의 컬럼이나 표현식을 기반 데이터 소스와 호환되는 데이터 타입이나 표현식으로 변환해야 하는 모든 연산에 적용돼요. 예를 들어 CREATE TABLE AS 문장은 Trino 타입을 지정하고, 그 타입들이 원격 데이터 소스의 타입으로 매핑돼요.
WHERE같은 프레디킷도 프레디킷이 원격 데이터 소스의 유효한 문법으로 변환되도록 이러한 매핑을 사용해요.
데이터 타입 지원과 매핑은 커넥터에 따라 다르며, 자세한 내용은 커넥터 문서를 참고하세요.
Boolean
-
BOOLEANtrue와falseboolean 값을 담아요.
정수 (Integer)
정수는 다음 형식의 숫자 리터럴로 표현할 수 있어요.
- 십진 정수. 예:
-7,0,3. 0X또는0x와 값으로 구성된 16진수 정수. 예: 십진10의0x0A, 십진17의0x11.0O또는0o와 값으로 구성된 8진수 정수. 예: 십진32의0o40, 십진9의0o11.0B또는0b와 값으로 구성된 2진수 정수. 예: 십진9의0b1001, 십진42의0b101010.
리터럴 값 안의 밑줄 문자는 무시되며 가독성을 높이는 데 사용할 수 있어요. 예를 들어 십진 정수 123_456은 123456과 같아요. 앞의 밑줄, 뒤의 밑줄, 연속된 밑줄은 허용되지 않아요.
정수는 다음 데이터 타입이 지원해요.
-
TINYINT최소값
-2^7또는-0x80, 최대값2^7 - 1또는0x7F인 8비트 부호 2의 보수(two's complement) 정수. -
SMALLINT최소값
-2^15또는-0x8000, 최대값2^15 - 1또는0x7FFF인 16비트 부호 2의 보수 정수. -
INTEGER또는INT최소값
-2^31또는-0x80000000, 최대값2^31 - 1또는0x7FFFFFFF인 32비트 부호 2의 보수 정수. 이 타입에는INTEGER와INT이름을 모두 쓸 수 있어요. -
BIGINT최소값
-2^63또는-0x8000000000000000, 최대값2^63 - 1또는0x7FFFFFFFFFFFFFFF인 64비트 부호 2의 보수 정수.
부동소수점 (Floating-point)
고정 정밀도의 부동소수점 수는 1.03e1 같은 과학적 표기법으로 숫자 리터럴로 표현할 수 있고 DOUBLE 데이터 타입으로 캐스팅돼요. 리터럴 값 안의 밑줄 문자는 무시되며 가독성을 높이는 데 사용할 수 있어요. 예를 들어 123_456.789e4는 123456.789e4와 같아요. 앞의 밑줄, 뒤의 밑줄, 연속된 밑줄, 소수점(.) 옆의 밑줄은 허용되지 않아요.
-
REALIEEE Standard 754(이진 부동소수점 산술)를 구현하는 32비트 부정확, 가변 정밀도 실수.
예시 리터럴:
REAL '10.3',REAL '10.3e0',REAL '1.03e1' -
DOUBLEIEEE Standard 754를 구현하는 64비트 부정확, 가변 정밀도 실수.
예시 리터럴:
DOUBLE '10.3',DOUBLE '1.03e1',10.3e0,1.03e1 -
NUMBER최소 50자리 십진수의, 정밀도가 지정되지 않은 부동소수점 십진수.
1e-100또는 더 작은 양수,1e100또는 더 큰 값을 지원해요.SELECT NUMBER '3.1415926535897932384626433832795028841971693993751' -- 3.1415926535897932384626433832795028841971693993751 (정밀도 손실 없음) SELECT NUMBER '12345678901234567890123456789012345678901234567890e30' -- 1.234567890123456789012345678901234567890123456789E+79 (정밀도 손실 없음)NUMBER타입은 부동소수점 타입과 유사한 의미론으로 특수값Infinity,-Infinity,NaN을 지원해요.SELECT NUMBER 'Infinity'; -- Infinity SELECT NUMBER '-Infinity'; -- -Infinity SELECT NUMBER 'NaN'; -- NaN0으로 나누면 "Division by zero" 오류가 발생해요.
SELECT NUMBER '1' / NUMBER '0'; -- ERROR: Division by zeroNaN은 자기 자신을 포함해 어떤 값과도 같지 않아요.SELECT NUMBER 'NaN' = NUMBER 'NaN'; -- false정렬 순서는
-Infinity< 모든 유한 값 <Infinity<NaN규칙을 따라요.예시 리터럴:
NUMBER '10.3',NUMBER '1234567890',NUMBER '1e3',NUMBER 'Infinity',NUMBER 'NaN'
정확한 숫자 (Exact numeric)
정확한 숫자 값은 1.1 같은 숫자 리터럴로 표현할 수 있고, DECIMAL 데이터 타입이 지원해요.
리터럴 값 안의 밑줄 문자는 무시되며 가독성을 높이는 데 사용할 수 있어요. 예를 들어 십진 123_456.789_123은 123456.789123과 같아요. 앞의 밑줄, 뒤의 밑줄, 연속된 밑줄, 소수점(.) 옆의 밑줄은 허용되지 않아요.
리터럴 값의 앞자리 0은 허용되며 무시돼요. 예를 들어 000123.456은 123.456과 같아요.
-
DECIMAL정확한 십진수. 최대 38자리 정밀도를 지원하지만 18자리까지가 성능이 가장 좋아요.
decimal 타입은 두 리터럴 파라미터를 받아요.
- precision — 총 자릿수
- scale — 소수부의 자릿수. 선택 사항이며 기본값은 0.
예시 타입 정의:
DECIMAL(10,3),DECIMAL(20)예시 리터럴:
DECIMAL '10.3',DECIMAL '1234567890',1.1
문자열 (String)
-
VARCHAR선택적 최대 길이를 가진 가변 길이 문자 데이터.
예시 타입 정의:
varchar,varchar(20)SQL 문장은 단순 리터럴과 유니코드 사용을 지원해요.
- 리터럴 문자열:
'Hello winter !' - 기본 이스케이프 문자가 있는 유니코드 문자열:
U&'Hello winter \2603 !' - 커스텀 이스케이프 문자가 있는 유니코드 문자열:
U&'Hello winter #2603 !' UESCAPE '#'
유니코드 문자열은
U&접두사로 시작하며, 4자리 유니코드 문자 사용 앞에 이스케이프 문자가 필요해요. 위 예시에서\2603과#2603은 눈사람 문자를 나타내요. 6자리 긴 유니코드 코드는 코드 앞에 플러스 기호를 사용해야 해요. 예를 들어 활짝 웃는 얼굴 이모지에는\+01F600을 사용해야 해요.문자열 리터럴의 작은따옴표는 또 다른 작은따옴표로 이스케이프할 수 있어요:
'I am big, it''s the pictures that got small!' - 리터럴 문자열:
메서드 (Methods)
VARCHAR 값에 사용할 수 있는 인스턴스 메서드는 다음과 같아요. 각각 새 값을 반환하며, 수신자(receiver)는 절대 수정되지 않아요. 관련된 일반 함수는 각 항목에서 연결돼요.
-
string.length() → bigintstring의 유니코드 코드 포인트 수를 반환해요. 관련:length().SELECT 'Hello, World!'.length(); -- 13 -
string.lower() → varchar모든 문자를 소문자로 변환한
string을 반환해요. 관련:lower().SELECT 'HELLO'.lower(); -- hello -
string.upper() → varchar모든 문자를 대문자로 변환한
string을 반환해요. 관련:upper().SELECT 'hello'.upper(); -- HELLO -
string.replace(search) → varchar부분 문자열
search의 모든 발생을 제거한string을 반환해요. 관련:replace().SELECT 'a.b.c'.replace('.'); -- abc -
string.replace(search, replacement) → varchar부분 문자열
search의 모든 발생을replacement로 교체한string을 반환해요. 관련:replace().SELECT 'a.b.c'.replace('.', '-'); -- a-b-c -
string.reverse() → varchar코드 포인트 순서를 뒤집은
string을 반환해요. 관련:reverse().SELECT 'Trino'.reverse(); -- onirT -
string.split(delimiter)delimiter의 각 발생에서string을 분할해 조각을 배열로 반환해요. 관련:split().SELECT 'a,b,c'.split(','); -- [a, b, c] -
string.split(delimiter, limit)delimiter로string을 최대limit개 조각으로 분할하며, 마지막 조각은 분할되지 않은 나머지를 담아요. 관련:split().SELECT 'a,b,c'.split(',', 2); -- [a, b,c] -
string.ends_with(suffix) → booleanstring이suffix로 끝나면true, 그렇지 않으면false를 반환해요. 관련:ends_with().SELECT 'apple'.ends_with('ple'); -- true -
string.starts_with(prefix) → booleanstring이prefix로 시작하면true, 그렇지 않으면false를 반환해요. 관련:starts_with().SELECT 'apple'.starts_with('app'); -- true -
string.strpos(substring) → bigintstring에서substring첫 발생의 1 기반 인덱스를 반환하거나, 발생하지 않으면0을 반환해요. 관련:strpos().SELECT 'hello'.strpos('l'); -- 3 -
string.strpos(substring, instance) → bigintstring에서substring의instance번째 발생의 1 기반 인덱스를 반환하거나, 발생 수가instance보다 적으면0을 반환해요. 관련:strpos().SELECT 'hello'.strpos('l', 2); -- 4 -
string.substring(start) → varchar1 기반 인덱스
start부터 끝까지의string부분을 반환해요. 관련:substring().SELECT 'Trino'.substring(2); -- rino -
string.substring(start, length) → varchar1 기반 인덱스
start에서 시작하는string의length코드 포인트를 반환해요. 관련:substring().SELECT 'Trino'.substring(2, 2); -- ri -
string.translate(from, to) → varcharfrom에 나타나는 각 문자를to의 같은 위치 문자로 교체하고,to가 더 짧으면 제거한string을 반환해요. 관련:translate().SELECT 'abcd'.translate('ac', 'xy'); -- xbyd -
string.trim() → varchar양끝에서 공백을 제거한
string을 반환해요. 관련:trim().SELECT ' hi '.trim(); -- hi -
string.trim(chars) → varchar양끝에서
chars의 어떤 문자든 제거한string을 반환해요. 관련:trim().SELECT '##hi##'.trim('#'); -- hi -
string.ltrim() → varchar시작에서 공백을 제거한
string을 반환해요. 관련:ltrim(). -
string.ltrim(chars) → varchar시작에서
chars의 어떤 문자든 제거한string을 반환해요. 관련:ltrim(). -
string.rtrim() → varchar끝에서 공백을 제거한
string을 반환해요. 관련:rtrim(). -
string.rtrim(chars) → varchar끝에서
chars의 어떤 문자든 제거한string을 반환해요. 관련:rtrim(). -
string.lpad(size, padstring) → varcharsize코드 포인트 길이가 될 때까지 왼쪽에padstring사본을 채우거나, 이미 더 길면size로 잘라낸string을 반환해요. 관련:lpad().SELECT '7'.lpad(3, '0'); -- 007 -
string.rpad(size, padstring) → varcharsize코드 포인트 길이가 될 때까지 오른쪽에padstring사본을 채우거나, 이미 더 길면size로 잘라낸string을 반환해요. 관련:rpad().SELECT '7'.rpad(3, '0'); -- 700 -
string.to_utf8() → varbinarystring의 UTF-8 인코딩을VARBINARY값으로 반환해요. 관련:to_utf8().
다음 정적 메서드는 VARCHAR 값을 구성해요.
-
varchar::chr(n) -> varchar유일한 문자의 유니코드 코드 포인트가
n인 한 문자 문자열을 반환해요. 관련:chr().SELECT varchar::chr(65); -- A -
varchar::from_utf8(binary) -> varcharbinary의 UTF-8 바이트에서 디코딩한 문자열을 반환하며, 잘못된 바이트 시퀀스는 유니코드 대체 문자로 교체해요. 관련:from_utf8().SELECT varchar::from_utf8(X'48656C6C6F'); -- Hello -
varchar::from_utf8(binary, replace) -> varcharbinary의 UTF-8 바이트에서 디코딩한 문자열을 반환하며, 잘못된 바이트 시퀀스는 문자열replace로 교체해요. 관련:from_utf8(). -
CHAR고정 길이 문자 데이터. 길이를 지정하지 않은
CHAR타입은 기본 길이 1을 가져요.CHAR(x)값은 항상 고정 길이x문자예요. 예를 들어dog를CHAR(7)로 캐스팅하면 암시적 후행 공백 4개가 추가돼요.VARCHAR와 마찬가지로CHAR리터럴의 작은따옴표는 또 다른 작은따옴표로 이스케이프할 수 있어요.SELECT CHAR 'All right, Mr. DeMille, I''m ready for my close-up.'예시 타입 정의:
char,char(20)
CHAR와 VARCHAR 강제 변환과 비교
CHAR 값은 암시적으로 VARCHAR로 강제 변환되며, 후행 공백이 제거된 값을 산출해요(예: CHAR(7) 'dog'는 VARCHAR 'dog'가 되고, CAST(CHAR(7) 'dog' AS VARCHAR)는 'dog'를 반환하며 패딩된 형태가 아니에요). 반대 방향으로는 암시적 강제 변환이 없어요.
그 결과 CHAR와 VARCHAR 값을 비교하면 VARCHAR 의미론을 따라요. CHAR 값이 VARCHAR로 강제 변환되고(후행 공백 제거) 공백 패딩 없이 비교되므로 후행 공백이 중요해져요. 예를 들어 CHAR 'a' = VARCHAR 'a '는 false예요. 두 CHAR 값 사이의 비교는 영향받지 않고 공백 패딩이 유지돼요.
메서드 (Methods)
CHAR 값에 사용할 수 있는 인스턴스 메서드는 다음과 같아요. 각각 새 값을 반환하며 수신자는 수정되지 않아요.
-
string.length() → bigint—string의 유니코드 코드 포인트 수. 관련:length(). -
string.lower() → char— 모든 문자를 소문자로 변환. 관련:lower(). -
string.upper() → char— 모든 문자를 대문자로 변환. 관련:upper(). -
string.reverse() → char— 코드 포인트 순서를 뒤집음. 관련:reverse(). -
string.substring(start) → char— 1 기반 인덱스start부터 끝까지의 부분. 관련:substring(). -
string.substring(start, length) → char— 1 기반 인덱스start에서 시작하는length코드 포인트. 관련:substring(). -
string.lpad(size, padstring) → varchar— 왼쪽에padstring채움. 관련:lpad(). -
string.to_utf8() → varbinary— UTF-8 인코딩을VARBINARY로. 관련:to_utf8(). -
VARBINARY가변 길이 이진 데이터.
SQL 문장은
X또는x접두사의 이진 리터럴 데이터 사용을 지원해요. 이진 데이터는 16진수 형식이어야 해요. 예를 들어eh?의 이진 형식은X'65683F'이며, 다음 문장으로 확인할 수 있어요.SELECT from_utf8(x'65683F');이진 리터럴은 어떤 공백 문자도 무시해요. 예를 들어 리터럴
X'FFFF 0FFF 3FFF FFFF'는X'FFFF0FFF3FFFFFFF'와 같아요.📌 참고: 길이가 있는 이진 문자열은 아직 지원되지 않아요:
varbinary(n) -
JSONJSON 값 타입으로, JSON 객체·배열·숫자·문자열,
true,false또는null일 수 있어요. -
VARIANT반정형(semi-structured) 값 타입.
VARIANT값은 다음 중 어떤 것도 나타낼 수 있어요.- 객체(키-값 구조)
- 배열
- 문자열
- 숫자(정수, 소수, 부동소수점)
- boolean
- null
- 날짜와 시간 값
VARIANT는 반정형 데이터를 효율적으로 다루도록 설계됐으며, 네이티브 variant 타입을 지원하는 커넥터와 파일 형식에서 흔히 사용돼요.VARIANT는 값들을 제한된 JSON 타입 집합으로 줄이는 대신 기반 값 타입 전체를 보존한다는 점에서 JSON과 달라요.예시:
SELECT typeof(CAST(JSON '{"a": 1, "b": [true, null]}' AS VARIANT)); -- variant SELECT CAST(CAST(JSON '123' AS VARIANT) AS BIGINT); -- 123VARIANT는 Apache Iceberg Variant 스펙을 따르며, Trino는 타입 시스템, 값 인코딩, 의미론을 포함한 이 스펙을 직접 구현해요. 이는 같은 스펙을 지원하는 시스템 간에 variant 값을 읽고 쓸 때 일관된 동작을 보장해요. 관련: VARIANT functions and operators
날짜와 시간 (Date and time)
관련: Date and time functions and operators
-
DATE달력 날짜(연, 월, 일).
예시:
DATE '2001-08-22' -
TIMETIME은TIME(3)(밀리초 정밀도)의 별칭이에요. -
TIME(P)시간대가 없는 하루의 시각(시, 분, 초)이며 초의 분수에 대해
P자리 정밀도. 최대 12자리(피코초) 정밀도를 지원해요.예시:
TIME '01:02:03.456' -
TIME WITH TIME ZONE시간대가 있는 하루의 시각(시, 분, 초, 밀리초). 이 타입의 값은 그 값의 시간대를 사용해 렌더링돼요. 시간대는 숫자 UTC 오프셋 값으로 표현돼요.
SELECT TIME '01:02:03.456 -08:00'; -- 1:02:03.456-08:00 -
TIMESTAMPTIMESTAMP는TIMESTAMP(3)(밀리초 정밀도)의 별칭이에요. -
TIMESTAMP(P)시간대가 없는 달력 날짜와 하루의 시각이며 초의 분수에 대해
P자리 정밀도. 최대 12자리(피코초) 정밀도를 지원해요. 이 타입은 효과적으로DATE와TIME(P)타입의 결합이에요.TIMESTAMP(P) WITHOUT TIME ZONE은 동일한 이름이에요.타임스탬프 값은
TIMESTAMP리터럴 표현식으로 구성할 수 있어요. 또는localtimestamp(p)같은 언어 구성이나 여러 날짜·시간 함수와 연산자가 타임스탬프 값을 반환할 수 있어요.더 낮은 정밀도로 캐스팅하면 값이 절단(truncate)되지 않고 반올림돼요. 더 높은 정밀도로 캐스팅하면 추가 자릿수에 0이 붙어요.
다음 예시는 이 동작을 보여 줘요.
SELECT TIMESTAMP '2020-06-10 15:55:23'; -- 2020-06-10 15:55:23 SELECT TIMESTAMP '2020-06-10 15:55:23.383345'; -- 2020-06-10 15:55:23.383345 SELECT typeof(TIMESTAMP '2020-06-10 15:55:23.383345'); -- timestamp(6) SELECT cast(TIMESTAMP '2020-06-10 15:55:23.383345' as TIMESTAMP(1)); -- 2020-06-10 15:55:23.4 SELECT cast(TIMESTAMP '2020-06-10 15:55:23.383345' as TIMESTAMP(12)); -- 2020-06-10 15:55:23.383345000000 -
TIMESTAMP WITH TIME ZONETIMESTAMP WITH TIME ZONE은TIMESTAMP(3) WITH TIME ZONE(밀리초 정밀도)의 별칭이에요. -
TIMESTAMP(P) WITH TIME ZONE초의 분수에 대해
P자리 정밀도와 시간대를 가진, 하루의 날짜와 시각을 포함하는 시점(instant). 이 타입의 값은 그 값의 시간대를 사용해 렌더링돼요. 시간대는 다음 방식으로 표현할 수 있어요.UTC.GMT,Z,UT를 UTC의 별칭으로 사용할 수 있어요.+hh:mm또는-hh:mm이며hh:mm은 UTC로부터의 시·분 오프셋.UTC,GMT,UT를 UTC의 별칭으로 붙이거나 붙이지 않고 쓸 수 있어요.- IANA 시간대 이름.
다음 예시는 이러한 문법 옵션 중 일부를 보여 줘요.
SELECT TIMESTAMP '2001-08-22 03:04:05.321 UTC'; -- 2001-08-22 03:04:05.321 UTC SELECT TIMESTAMP '2001-08-22 03:04:05.321 -08:30'; -- 2001-08-22 03:04:05.321 -08:30 SELECT TIMESTAMP '2001-08-22 03:04:05.321 GMT-08:30'; -- 2001-08-22 03:04:05.321 -08:30 SELECT TIMESTAMP '2001-08-22 03:04:05.321 America/New_York'; -- 2001-08-22 03:04:05.321 America/New_York -
INTERVAL YEAR TO MONTH연과 월의 범위.
예시:
INTERVAL '3' MONTH -
INTERVAL DAY TO SECOND일, 시, 분, 초, 밀리초의 범위.
예시:
INTERVAL '2' DAY
구조적 (Structural)
-
ARRAY주어진 구성 요소 타입의 배열.
예시:
ARRAY[1, 2, 3]더 자세한 내용은 Array functions and operators 문서 참고.
-
MAP주어진 구성 요소 타입 사이의 맵. 맵은 키-값 쌍의 컬렉션이며 각 키는 단일 값과 연관돼요. 맵 키는 필수이고, 맵 값은 null일 수 있어요.
예시:
MAP(ARRAY['foo', 'bar'], ARRAY[1, 2])더 자세한 내용은 Map functions and operators 문서 참고.
-
ROW혼합 타입을 허용하는 필드로 구성된 구조. 필드는 어떤 SQL 타입도 될 수 있어요.
기본적으로 row 필드는 이름이 없지만 이름을 지정할 수 있어요.
예시:
CAST(ROW(1, 2e0) AS ROW(x BIGINT, y DOUBLE))이름이 있는 row 필드는 필드 참조 연산자(
.)로 접근해요.예시:
CAST(ROW(1, 2.0) AS ROW(x BIGINT, y DOUBLE)).x이름이 있는 또는 없는 row 필드는 첨자 연산자(
[])로 위치로 접근할 수 있어요. 위치는1부터 시작하며 상수여야 해요.예시:
ROW(1, 2.0)[1]
네트워크 주소 (Network address)
-
IPADDRESSIPv4 또는 IPv6 주소를 나타낼 수 있는 IP 주소. 내부적으로 이 타입은 순수 IPv6 주소예요. IPv4 지원은 IPv4-mapped IPv6 주소 범위(RFC 4291#section-2.5.5.2)를 사용해 처리돼요.
IPADDRESS를 만들 때 IPv4 주소는 그 범위로 매핑돼요.IPADDRESS를 포맷할 때 매핑된 범위 안의 모든 주소는 IPv4 주소로 포맷돼요. 다른 주소는 RFC 5952에 정의된 canonical 형식으로 IPv6로 포맷돼요.예시:
IPADDRESS '10.0.0.1',IPADDRESS '2001:db8::1'
UUID
-
UUIDRSS 4122에 정의된 형식을 사용하는 UUID(Universally Unique IDentifier)를 나타내며, GUID(Globally Unique IDentifier)라고도 불러요.
예시:
UUID '12151fd2-7586-11e9-8f9e-2a86e4085a59'
HyperLogLog
HyperLogLog 데이터 스케치로 근사 고유 개수를 정확한 개수보다 훨씬 저렴하게 계산할 수 있어요. 관련: HyperLogLog functions.
-
HyperLogLogHyperLogLog 스케치는
approx_distinct()의 효율적인 계산을 허용해요. 희소(sparse) 표현으로 시작하며, 더 효율적일 때 조밀(dense) 표현으로 전환해요. -
P4HyperLogLogP4HyperLogLog 스케치는 HyperLogLog와 비슷하지만, 시작 시(그리고 계속) 조밀 표현을 사용해요.
SetDigest
-
SetDigestSetDigest(setdigest)는 두 집합 사이의 Jaccard 유사도 계수를 계산하는 데 사용되는 데이터 스케치 구조예요.
SetDigest는 다음 구성 요소를 캡슐화해요.
- HyperLogLog
- 단일 해시 함수가 있는 MinHash
HyperLogLog 구조는 원래 집합의 고유 요소 근사에 사용돼요. MinHash 구조는 원래 집합의 낮은 메모리 사용량 시그니처를 저장하는 데 사용돼요. 두 집합의 유사도는 시그니처를 비교해 추정돼요.
SetDigest는 가산적(additive)이며, 즉 서로 병합할 수 있어요.
분위수 다이제스트 (Quantile digest)
-
QDigest분위수 다이제스트(qdigest)는 주어진 입력 집합의 대략적인 데이터 분포를 캡처하는 요약 구조로, 분포에서 근사 분위수 값을 가져오도록 쿼리할 수 있어요. qdigest의 정확도 수준은 조정 가능하며, 공간을 희생해 더 정밀한 결과를 얻을 수 있어요.
qdigest는 특정 분위수에 속하는 값이 무엇인지 묻는 쿼리에 근사 답을 주는 데 사용할 수 있어요. qdigest의 유용한 성질은 가산적이라는 것이에요. 즉 정밀도를 잃지 않고 병합할 수 있어요.
qdigest는
approx_percentile의 부분 결과를 재사용할 수 있을 때마다 유용할 수 있어요. 예를 들어 일주일 동안 읽히는 99번째 백분위수 값의 일일 판독에 관심이 있을 수 있어요. 지난 주 데이터를approx_percentile로 계산하는 대신 qdigest를 매일 저장하고, 빠르게 병합해 99번째 백분위수 값을 얻을 수 있어요.
T-Digest
-
TDigestT-digest(tdigest)는 qdigest와 유사하게 주어진 입력 집합의 대략적인 데이터 분포를 캡처하는 요약 구조예요. 분포에서 근사 분위수 값을 가져오도록 쿼리할 수 있어요.
TDigest는 QDigest에 비해 다음 장점이 있어요.
- 더 높은 성능
- 더 낮은 메모리 사용
- 낮은·높은 백분위수에서 더 높은 정확도
T-digest는 가산적이며, 즉 서로 병합할 수 있어요.
더 알아보기 (Learn more)
Trino의 데이터 타입을 모두 살펴봤어요. 이어서 키워드와 식별자(Keywords and identifiers)를 배워보면 좋아요.