타입 변환 함수

타입 변환 함수 (Type Conversion Functions)

Pinot은 데이터 타입 간 값을 변환하고, 바이너리·hex·Base64 표현 간 인코딩/디코딩을 수행하는 함수를 제공해요.

출처: 문서

본문

CAST

CAST(value AS type)

값을 지정한 대상 타입으로 변환해요. Pinot이 지원하는 표준 SQL cast 문법입니다.

지원 대상 타입:

타입 별칭 설명
INT INTEGER 32비트 정수
LONG BIGINT 64비트 정수
FLOAT 32비트 부동소수점
DOUBLE 64비트 부동소수점
BOOLEAN 부울 값
TIMESTAMP 타임스탬프 값
STRING VARCHAR 문자열 값
BYTES VARBINARY 바이트 배열
BIG_DECIMAL DECIMAL 임의 정밀도 십진수

Pinot은 SQL 표준 부호 없는 정수 타입 대상 TINYINT UNSIGNED, SMALLINT UNSIGNED, INTEGER UNSIGNED도 허용해요. Pinot은 부호 없는 정수를 저장하지 않으므로, 이 cast들은 전체 범위를 보존하는 가장 좁은 부호 있는 타입을 반환합니다: TINYINT UNSIGNED와 SMALLINT UNSIGNED는 INT처럼, INTEGER UNSIGNED는 LONG처럼 동작해요. BIGINT UNSIGNED는 지원되지 않으며, 대신 BIGINT 또는 DECIMAL을 사용하세요.

배열 값 cast의 경우 Pinot은 표준 SQL에서 CAST(expr AS DECIMAL ARRAY)를 지원해요. 단일 스테이지 엔진에서는 Pinot 고유 타입 이름 BIG_DECIMAL_ARRAY도 허용합니다.

SELECT CAST(revenue AS DOUBLE) AS revenue_double,
       CAST(zipCode AS VARCHAR) AS zip_string,
       CAST('12345' AS BIGINT) AS id_long
FROM orders
LIMIT 5

함수 호출 형식 cast(value, 'TYPE')도 지원됩니다.

SELECT cast(revenue, 'DOUBLE') AS revenue_double
FROM orders
LIMIT 5

STRING을 INT 또는 LONG으로 cast할 때 Pinot은 먼저 직접 정수 파싱을 시도하고, 실패하면 문자열을 DOUBLE로 파싱한 뒤 절사합니다. LONG의 경우 DOUBLE 변환으로 폴백하기 전에 타임스탬프 파싱도 시도합니다.

UUID 함수

Pinot은 단일 스테이지 및 다중 스테이지 쿼리 엔진 모두에서 UUID 인식 함수를 제공해요. UUID 의미론 함수는 STRING, 16바이트 BYTES 값, 논리적 UUID 컬럼을 받습니다. 문자열 입력은 표준 대시 RFC 4122 텍스트 또는 대시 없는 32자리 16진수일 수 있어요.

안정적인 외부 표현이 필요할 때 UUID_TO_STRING을 사용하세요: 항상 대시가 있는 소문자 UUID 텍스트를 반환합니다. CAST(uuid_expression AS STRING)은 단일 값 및 다중 값 논리적 UUID 표현에 대해 동일한 표준 대시 형식을 사용해요. 일반 BYTES 값은 변경되지 않고 여전히 16진수로 렌더링됩니다. Pinot은 UUID 인식 함수 안에서만 바이트를 UUID로 디코딩해요.

함수 입력 결과 동작
IS_UUID(value) STRING, BYTES, UUID BOOLEAN 유효하지 않은 null이 아닌 값에 false 반환. 유효한 바이트 값은 정확히 16바이트.
TO_UUID(value) STRING, BYTES, UUID UUID UUID 표현을 Pinot의 논리적 UUID 타입으로 변환.
BYTES_TO_UUID(bytes) BYTES만 UUID 16바이트 UUID 값을 엄격히 변환.
UUID_TO_STRING(value) STRING, BYTES, UUID STRING 표준 소문자 대시 UUID 텍스트 반환.

bigDecimalToBytes

bigDecimalToBytes(bigDecimalCol)

BIG_DECIMAL 값을 바이트 배열 표현으로 직렬화해요. 결과 바이트는 빅엔디언 순서로 scale에 이어 unscaled 값을 포함합니다.

SELECT bigDecimalToBytes(price) AS priceBytes
FROM products
LIMIT 5

bytesToBigDecimal

bytesToBigDecimal(bytesCol)

bigDecimalToBytes로 이전에 만든 바이트 배열을 다시 BIG_DECIMAL 값으로 역직렬화해요.

SELECT bytesToBigDecimal(priceBytes) AS price
FROM products
LIMIT 5

hexToBytes

hexToBytes(hexString)

일반 hex 문자열을 바이트 배열로 변환해요.

SELECT hexToBytes('f0e1a3b2') AS rawBytes
FROM myTable
LIMIT 1
-- Converts hex string to 4-byte array

bytesToHex

bytesToHex(bytesCol)

바이트 배열을 일반 hex 문자열로 변환해요.

SELECT bytesToHex(rawData) AS hexString
FROM myTable
LIMIT 5
-- Returns hex representation such as 'f012be3c'

base64Encode

base64Encode(bytesCol)

바이트 배열을 Base64 표현으로 인코딩해요.

SELECT base64Encode(payload) AS encodedPayload
FROM events
LIMIT 5

base64Decode

base64Decode(bytesCol)

Base64 인코딩된 바이트 배열을 원래 바이트로 디코딩해요.

SELECT base64Decode(encodedPayload) AS originalPayload
FROM events
LIMIT 5

hexDecimalToLong

hexDecimalToLong(hexString)

16진수 문자열을 해당 LONG 값으로 변환해요. 0x 접두사가 있거나 없는 문자열을 허용합니다.

SELECT hexDecimalToLong('0x1a2b') AS longVal
FROM myTable
LIMIT 1
-- Returns 6699

longToHexDecimal

longToHexDecimal(longCol)

LONG 값을 16진수 문자열 표현으로 변환해요.

SELECT longToHexDecimal(6699) AS hexVal
FROM myTable
LIMIT 1
-- Returns '1a2b'

더 알아보기 (Learn more)