타입 변환 함수

타입 변환 함수 (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

더 알아보기 (Learn more)