타입 변환 함수
타입 변환 함수 (Type Conversion Functions)
PPL에서 지원하는 타입 변환 함수에 대해 알아봐요. CAST, TOSTRING, TONUMBER 함수를 사용해 값을 다른 타입으로 변환할 수 있어요.
출처: 문서
본문
PPL에서 지원하는 타입 변환 함수는 다음과 같아요.
CAST
사용법: cast(expr as dataType)
표현식을 지정된 데이터 타입으로 변환하고 변환된 값을 반환해요.
매개변수:
expr(필수): 다른 데이터 타입으로 변환할 표현식이에요.dataType(필수): 변환 연산의 대상 데이터 타입이에요.
반환 타입: data type에 의해 결정됨
다음 표는 데이터 타입 간 변환에 사용되는 규칙을 보여줘요:
| Src/Target | STRING | NUMBER | BOOLEAN | TIMESTAMP | DATE | TIME | IP |
|---|---|---|---|---|---|---|---|
| STRING | Note1 | Note1 | TIMESTAMP() | DATE() | TIME() | IP() | |
| NUMBER | Note1 | v!=0 | N/A | N/A | N/A | N/A | |
| BOOLEAN | Note1 | v?1:0 | N/A | N/A | N/A | N/A | |
| TIMESTAMP | Note1 | N/A | N/A | DATE() | TIME() | N/A | |
| DATE | Note1 | N/A | N/A | N/A | N/A | N/A | |
| TIME | Note1 | N/A | N/A | N/A | N/A | N/A | |
| IP | Note2 | N/A | N/A | N/A | N/A | N/A |
Note1: 변환은 JDK 사양을 따릅니다. Note2: IP 주소는 표준(canonical) 표현으로 변환됩니다. IPv6의 표준 표현은 RFC 5952에 설명되어 있습니다.
예제
다음 예제는 서로 다른 데이터 타입을 문자열로 변환해요:
source=people
| eval `cbool` = CAST(true as string), `cint` = CAST(1 as string), `cdate` = CAST(CAST('2012-08-07' as date) as string)
| fields `cbool`, `cint`, `cdate`
쿼리는 다음과 같은 결과를 반환해요:
cbool | cint | cdate
TRUE | 1 | 2012-08-07
다음 예제는 값을 정수 타입으로 변환해요:
source=people
| eval `cbool` = CAST(true as int), `cstring` = CAST('1' as int)
| fields `cbool`, `cstring`
쿼리는 다음과 같은 결과를 반환해요:
cbool | cstring
1 | 1
다음 예제는 문자열을 date, time, timestamp 타입으로 변환해요:
source=people
| eval `cdate` = CAST('2012-08-07' as date), `ctime` = CAST('01:01:01' as time), `ctimestamp` = CAST('2012-08-07 01:01:01' as timestamp)
| fields `cdate`, `ctime`, `ctimestamp`
쿼리는 다음과 같은 결과를 반환해요:
cdate | ctime | ctimestamp
2012-08-07 | 01:01:01 | 2012-08-07 01:01:01
다음 예제는 cast 함수를 연결(chaining)하는 방법을 보여줘요:
source=people
| eval `cbool` = CAST(CAST(true as string) as boolean)
| fields `cbool`
쿼리는 다음과 같은 결과를 반환해요:
cbool
True
암시적 타입 변환 (Implicit type conversion)
암시적 변환은 자동 캐스팅이에요. 함수가 입력 타입과 정확히 일치하지 않을 때, 엔진은 값을 안전하게 처리할 수 있는 다른 시그니처를 찾아요. 원래 타입의 변환이 가장 적게 필요한 옵션을 선택하므로, 명시적 cast 함수를 추가하지 않고도 리터럴과 필드를 섞어 사용할 수 있어요.
문자열에서 숫자 타입으로 변환
숫자 값이 필요한 곳에 문자열을 사용하면 엔진은 문자열을 숫자로 파싱하려 시도해요:
- 문자열은
"3.14"나"42"같은 유효한 숫자 값을 나타내야 해요. 다른 값이면 쿼리가 실패해요. - 문자열을 숫자 인수와 함께 사용하면 엔진은 그것을
DOUBLE로 취급해 함수의 숫자 오버로드를 적용해요.
예제
다음 예제는 산술 연산에서 문자열을 사용하는 방법을 보여줘요:
source=people
| eval divide="5"/10, multiply="5" * 10, add="5" + 10, minus="5" - 10, concat="5" + "5"
| fields divide, multiply, add, minus, concat
쿼리는 다음과 같은 결과를 반환해요:
divide | multiply | add | minus | concat
0.5 | 50.0 | 15.0 | -5.0 | 55
다음 예제는 비교 연산에서 문자열을 사용하는 방법을 보여줘요:
source=people
| eval e="1000"==1000, en="1000"!=1000, ed="1000"==1000.0, edn="1000"!=1000.0, l="1000">999, ld="1000">999.9, i="malformed"==1000
| fields e, en, ed, edn, l, ld, i
쿼리는 다음과 같은 결과를 반환해요:
e | en | ed | edn | l | ld | i
True | False | True | False | True | True | null
TOSTRING
사용법: tostring(value[, format])
값을 문자열 표현으로 변환해요. format이 제공되면 숫자를 지정된 형식 타입으로 변환해요. 불리언 값의 경우 TRUE 또는 FALSE로 변환해요.
매개변수:
value(필수): 문자열로 변환할 값 (모든 데이터 타입)이에요.format(선택): 숫자 변환을 위한 형식 타입이에요.value가 숫자일 때만 사용돼요.value가 불리언이면 이 매개변수는 무시돼요.
형식 타입 (Format types):
binary: 숫자를 이진 값으로 변환해요.hex: 숫자를 16진수 값으로 변환해요.commas: 숫자를 쉼표로 포맷해요. 숫자에 소수가 포함되면 함수는 숫자를 소수 두 자리로 반올림해요.duration: 초 단위 값을 읽기 쉬운HH:MM:SS형식으로 변환해요.duration_millis: 밀리초 단위 값을 읽기 쉬운HH:MM:SS형식으로 변환해요.
반환 타입: STRING
예제
다음 예제는 숫자를 이진 문자열 표현으로 변환해요:
source=accounts
| where firstname = "Amber"
| eval balance_binary = tostring(balance, "binary")
| fields firstname, balance_binary, balance
쿼리는 다음과 같은 결과를 반환해요:
firstname | balance_binary | balance
Amber | 1001100100111001 | 39225
다음 예제는 숫자를 16진수 문자열 표현으로 변환해요:
source=accounts
| where firstname = "Amber"
| eval balance_hex = tostring(balance, "hex")
| fields firstname, balance_hex, balance
쿼리는 다음과 같은 결과를 반환해요:
firstname | balance_hex | balance
Amber | 9939 | 39225
다음 예제는 숫자를 쉼표 구분자로 포맷해요:
source=accounts
| where firstname = "Amber"
| eval balance_commas = tostring(balance, "commas")
| fields firstname, balance_commas, balance
쿼리는 다음과 같은 결과를 반환해요:
firstname | balance_commas | balance
Amber | 39,225 | 39225
예제: 초를 duration 형식으로 변환
다음 예제는 초 단위 숫자를 시·분·초를 나타내는 HH:MM:SS 형식으로 변환해요:
source=accounts
| where firstname = "Amber"
| eval duration = tostring(6500, "duration")
| fields firstname, duration
쿼리는 다음과 같은 결과를 반환해요:
firstname | duration
Amber | 01:48:20
다음 예제는 불리언 값을 문자열로 변환해요:
source=accounts
| where firstname = "Amber"
| eval `boolean_str` = tostring(1=1)
| fields `boolean_str`
쿼리는 다음과 같은 결과를 반환해요:
boolean_str
TRUE
TONUMBER
사용법: tonumber(string[, base])
문자열 값을 숫자로 변환해요. 선택적 base 매개변수는 입력 문자열의 밑(base)을 지정해요. 제공하지 않으면 함수는 밑 10을 가정해요.
매개변수:
string(필수): 변환할 숫자의 문자열 표현이에요.base(선택): 입력 문자열의 밑(base) (2에서 36 사이)이에요. 기본값은10이에요.
반환 타입: NUMBER
이 함수는 eval 명령어 및 eval 표현식의 일부로 사용할 수 있어요. Base 값은 2에서 36 사이일 수 있어요.
값 제한 (Value limits):
- 밑 10: 최댓값은
+(2-2^-52)·2^1023, 최솟값은-(2-2^-52)·2^1023이에요. - 기타 밑: 최댓값은
2^63-1(또는7FFFFFFFFFFFFFFF), 최솟값은-2^63(또는-7FFFFFFFFFFFFFFF)이에요.
tonumber 함수가 필드 값을 숫자로 파싱할 수 없으면 NULL을 반환해요. 이 함수를 사용해 다양한 밑의 숫자 문자열 표현을 해당하는 밑 10 값으로 변환할 수 있어요.
예제: 이진 문자열을 숫자로 변환
source=people
| eval int_value = tonumber('010101',2)
| fields int_value
| head 1
쿼리는 다음과 같은 결과를 반환해요:
int_value
21.0
예제: 16진수 문자열을 숫자로 변환
source=people
| eval int_value = tonumber('FA34',16)
| fields int_value
| head 1
쿼리는 다음과 같은 결과를 반환해요:
int_value
64052.0
예제: 소수 부분이 없는 10진수 문자열을 숫자로 변환
source=people
| eval int_value = tonumber('4598')
| fields int_value
| head 1
쿼리는 다음과 같은 결과를 반환해요:
int_value
4598.0
예제: 소수 부분이 있는 10진수 문자열을 숫자로 변환
source=people
| eval double_value = tonumber('4598.678')
| fields double_value
| head 1
쿼리는 다음과 같은 결과를 반환해요:
double_value
4598.678