JSON 함수
JSON 함수 (JSON Functions)
PPL은 JSON 데이터를 생성하고, 파싱하고, 조작하기 위한 다음 JSON 함수를 지원해요.
출처: 문서
본문
PPL은 JSON 데이터를 생성·파싱·조작하기 위한 다음 JSON 함수를 지원해요.
JSON 경로 (JSON path)
JSON 함수에서 사용되는 모든 JSON 경로는 <key1>{<index1>}.<key2>{<index2>}... 형식을 따릅니다. 각 <key>는 필드 이름을 나타내요. {<index>} 부분은 선택 사항이며 해당 키가 배열을 가리킬 때만 사용돼요. 예를 들어:
a{2}.b{0}
이 경로는 a 배열의 인덱스 2 요소 안에 있는 b 배열의 인덱스 0 요소에 접근해요.
참고 (Notes):
{<index>}표기법은 연결된 키가 배열을 가리킬 때만 적용돼요.- 특정 인덱스가 없는
{}는 와일드카드로 해석되며{*}와 동일해요. 즉 해당 수준의 배열에 있는 모든 요소를 의미해요.
JSON
사용법: JSON(value)
JSON 문자열을 검증하고 파싱해요. 문자열이 유효한 JSON이면 파싱된 JSON 값을 반환하고, 유효하지 않으면 NULL을 반환해요.
매개변수:
value(필수): JSON으로 검증하고 파싱할 문자열이에요.
반환 타입: STRING
예제
source=json_test
| where json_valid(json_string)
| eval json=json(json_string)
| fields test_name, json_string, json
쿼리는 다음과 같은 결과를 반환해요:
test_name | json_string | json
json nested object | {"a":"1","b":{"c":"2","d":"3"}} | {"a":"1","b":{"c":"2","d":"3"}}
json object | {"a":"1","b":"2"} | {"a":"1","b":"2"}
json array | [1, 2, 3, 4] | [1, 2, 3, 4]
json scalar string | "abc" | "abc"
JSON_VALID
사용법: JSON_VALID(value)
문자열이 유효한 JSON 구문인지 평가해요. 유효하면 TRUE를, 유효하지 않으면 FALSE를 반환해요. NULL 입력은 NULL을 반환해요.
버전: 3.1.0 제한 사항: plugins.calcite.enabled=true일 때만 동작해요.
매개변수:
value(필수): JSON으로 검증할 문자열이에요.
반환 타입: BOOLEAN
예제
source=people
| eval is_valid_json = json_valid('[1,2,3,4]'), is_invalid_json = json_valid('{invalid}')
| fields is_valid_json, is_invalid_json
| head 1
쿼리는 다음과 같은 결과를 반환해요:
is_valid_json | is_invalid_json
True | False
JSON_OBJECT
사용법: JSON_OBJECT(key1, value1, key2, value2, ...)
지정된 키-값 쌍에서 JSON 객체 문자열을 만들어요. 모든 키는 문자열이어야 해요.
매개변수:
key1,value1(필수): 첫 번째 키-값 쌍이에요. 키는 문자열이어야 해요.key2,value2, ... (선택): 추가 키-값 쌍이에요.
반환 타입: STRING
예제
source=json_test
| eval test_json = json_object('key', 123.45)
| head 1
| fields test_json
쿼리는 다음과 같은 결과를 반환해요:
test_json
{"key":123.45}
JSON_ARRAY
사용법: JSON_ARRAY(element1, element2, ...)
지정된 요소에서 JSON 배열 문자열을 만들어요.
매개변수:
element1,element2, ... (선택): 배열에 포함할 요소예요. 모든 데이터 타입이 가능해요.
반환 타입: STRING
예제
source=json_test
| eval test_json_array = json_array('key', 123.45)
| head 1
| fields test_json_array
쿼리는 다음과 같은 결과를 반환해요:
test_json_array
["key",123.45]
JSON_ARRAY_LENGTH
사용법: JSON_ARRAY_LENGTH(value)
JSON 배열의 요소 개수를 반환해요. 입력이 유효한 JSON 배열이 아니거나, NULL이거나, 유효하지 않은 JSON을 포함하면 NULL을 반환해요.
매개변수:
value(필수): JSON 배열을 포함하는 문자열이에요.
반환 타입: INTEGER
예제
다음 예제는 유효한 JSON 배열의 길이를 반환해요:
source=json_test
| eval array_length = json_array_length("[1,2,3]")
| head 1
| fields array_length
쿼리는 다음과 같은 결과를 반환해요:
array_length
3
다음 예제는 배열이 아닌 JSON 값에 대해 NULL을 반환해요:
source=json_test
| eval array_length = json_array_length("{\"1\": 2}")
| head 1
| fields array_length
쿼리는 다음과 같은 결과를 반환해요:
array_length
null
JSON_EXTRACT
사용법: JSON_EXTRACT(json_string, path1, path2, ...)
지정된 JSON 경로를 사용해 JSON 문자열에서 값을 추출해요.
동작 (Behavior):
- 단일 경로: 추출된 값을 직접 반환해요.
- 여러 경로: 경로 순서대로 추출된 값을 포함하는 JSON 배열을 반환해요.
- 잘못된 경로: 결과에서 해당 경로에 대해
NULL을 반환해요.
경로 구문에 대한 자세한 내용은 JSON 경로 섹션을 참고해요.
매개변수:
json_string(필수): 값을 추출할 JSON 문자열이에요.path1,path2, ... (필수): 추출할 값을 지정하는 하나 이상의 JSON 경로예요.
반환 타입: STRING
예제
다음 예제는 단일 JSON 경로를 사용해 값을 추출해요:
source=json_test
| eval extract = json_extract('{"a": [{"b": 1}, {"b": 2}]}', 'a{}.b')
| head 1
| fields extract
쿼리는 다음과 같은 결과를 반환해요:
extract
[1,2]
다음 예제는 여러 JSON 경로를 사용해 값을 추출해요:
source=json_test
| eval extract = json_extract('{"a": [{"b": 1}, {"b": 2}]}', 'a{}.b', 'a{}')
| head 1
| fields extract
쿼리는 다음과 같은 결과를 반환해요:
extract
[[1,2],[{"b":1},{"b":2}]]
JSON_DELETE
사용법: JSON_DELETE(json_string, path1, path2, ...)
지정된 JSON 경로에서 JSON 문자열의 값을 삭제해요. 수정된 JSON 문자열을 반환해요. 경로가 값을 찾지 못하면 해당 경로에 대해 변경이 없어요.
매개변수:
json_string(필수): 값을 삭제할 JSON 문자열이에요.path1,path2, ... (필수): 삭제할 값을 지정하는 하나 이상의 JSON 경로예요.
반환 타입: STRING
예제
다음 예제는 단일 JSON 경로를 사용해 값을 삭제해요:
source=json_test
| eval delete = json_delete('{"a": [{"b": 1}, {"b": 2}]}', 'a{0}.b')
| head 1
| fields delete
쿼리는 다음과 같은 결과를 반환해요:
delete
{"a":[{},{"b":2}]}
다음 예제는 여러 JSON 경로를 사용해 값을 삭제해요:
source=json_test
| eval delete = json_delete('{"a": [{"b": 1}, {"b": 2}]}', 'a{0}.b', 'a{1}.b')
| head 1
| fields delete
쿼리는 다음과 같은 결과를 반환해요:
delete
{"a":[{},{}]}
다음 예제는 존재하지 않는 경로를 삭제하려고 할 때 변경이 없음을 보여줘요:
source=json_test
| eval delete = json_delete('{"a": [{"b": 1}, {"b": 2}]}', 'a{2}.b')
| head 1
| fields delete
쿼리는 다음과 같은 결과를 반환해요:
delete
{"a":[{"b":1},{"b":2}]}
JSON_SET
사용법: JSON_SET(json_string, path1, value1, path2, value2, ...)
지정된 JSON 경로에서 JSON 문자열의 값을 설정해요. 수정된 JSON 문자열을 반환해요. 경로의 부모 노드가 JSON 객체가 아니면 해당 경로는 건너뛰어요.
매개변수:
json_string(필수): 수정할 JSON 문자열이에요.path1,value1(필수): 설정할 첫 번째 경로-값 쌍이에요.path2,value2, ... (선택): 추가 경로-값 쌍이에요.
반환 타입: STRING
예제
다음 예제는 JSON 경로에 단일 값을 설정해요:
source=json_test
| eval jsonSet = json_set('{"a": [{"b": 1}]}', 'a{0}.b', 3)
| head 1
| fields jsonSet
쿼리는 다음과 같은 결과를 반환해요:
jsonSet
{"a":[{"b":3}]}
다음 예제는 여러 경로-값 쌍을 사용해 여러 값을 설정해요:
source=json_test
| eval jsonSet = json_set('{"a": [{"b": 1}, {"b": 2}]}', 'a{0}.b', 3, 'a{1}.b', 4)
| head 1
| fields jsonSet
쿼리는 다음과 같은 결과를 반환해요:
jsonSet
{"a":[{"b":3},{"b":4}]}
JSON_APPEND
사용법: JSON_APPEND(json_string, path1, value1, path2, value2, ...)
지정된 JSON 경로에서 JSON 문자열의 배열에 값을 추가해요. 수정된 JSON 문자열을 반환해요. 경로의 대상 노드가 배열이 아니면 해당 경로는 건너뛰어요.
매개변수:
json_string(필수): 수정할 JSON 문자열이에요.path1,value1(필수): 추가할 첫 번째 경로-값 쌍이에요.path2,value2, ... (선택): 추가 경로-값 쌍이에요.
반환 타입: STRING
예제
다음 예제는 배열에 값을 추가해요:
source=json_test
| eval jsonAppend = json_append('{"a": [{"b": 1}]}', 'a', 3)
| head 1
| fields jsonAppend
쿼리는 다음과 같은 결과를 반환해요:
jsonAppend
{"a":3}
다음 예제는 배열이 아닌 대상 경로는 건너뛰는 것을 보여줘요:
source=json_test
| eval jsonAppend = json_append('{"a": [{"b": 1}, {"b": 2}]}', 'a{0}.b', 3, 'a{1}.b', 4)
| head 1
| fields jsonAppend
쿼리는 다음과 같은 결과를 반환해요:
jsonAppend
{"a":[{"b":1},{"b":2}]}
다음 예제는 혼합 경로 타입을 사용해 값을 추가해요:
source=json_test
| eval jsonAppend = json_append('{"a": [{"b": 1}]}', 'a', '[1,2]', 'a{1}.b', 4)
| head 1
| fields jsonAppend
쿼리는 다음과 같은 결과를 반환해요:
jsonAppend
{"a":[{"b":1},"[1,2]"]}
JSON_EXTEND
사용법: JSON_EXTEND(json_string, path1, value1, path2, value2, ...)
지정된 JSON 경로에서 JSON 문자열의 배열을 새 값으로 확장해요. 수정된 JSON 문자열을 반환해요. 경로의 대상 노드가 배열이 아니면 해당 경로는 건너뛰어요.
함수는 각 값을 배열로 파싱하려 시도해요:
- 파싱이 성공하면: 파싱된 배열 요소가 대상 배열에 추가돼요.
- 파싱이 실패하면: 값이 단일 요소로 취급되어 대상 배열에 추가돼요.
매개변수:
json_string(필수): 수정할 JSON 문자열이에요.path1,value1(필수): 확장할 첫 번째 경로-값 쌍이에요.path2,value2, ... (선택): 추가 경로-값 쌍이에요.
반환 타입: STRING
예제
다음 예제는 단일 값으로 배열을 확장해요:
source=json_test
| eval jsonExtend = json_extend('{"a": [{"b": 1}]}', 'a', 3)
| head 1
| fields jsonExtend
쿼리는 다음과 같은 결과를 반환해요:
jsonExtend
{"a":[{"b":1},3]}
다음 예제는 배열이 아닌 대상 경로는 건너뛰는 것을 보여줘요:
source=json_test
| eval jsonExtend = json_extend('{"a": [{"b": 1}, {"b": 2}]}', 'a{0}.b', 3, 'a{1}.b', 4)
| head 1
| fields jsonExtend
쿼리는 다음과 같은 결과를 반환해요:
jsonExtend
{"a":[{"b":1},{"b":2}]}
다음 예제는 값을 배열로 파싱해 배열을 확장해요:
source=json_test
| eval jsonExtend = json_extend('{"a": [{"b": 1}]}', 'a', '[1,2]')
| head 1
| fields jsonExtend
쿼리는 다음과 같은 결과를 반환해요:
jsonExtend
{"a":[{"b":1},1.0,2.0]}
JSON_KEYS
사용법: JSON_KEYS(json_string)
JSON 객체의 키를 JSON 배열로 반환해요. 입력이 유효한 JSON 객체가 아니면 NULL을 반환해요.
매개변수:
json_string(필수): JSON 객체를 포함하는 문자열이에요.
반환 타입: STRING
예제
다음 예제는 단순 JSON 객체에서 키를 가져와요:
source=json_test
| eval jsonKeys = json_keys('{"a": 1, "b": 2}')
| head 1
| fields jsonKeys
쿼리는 다음과 같은 결과를 반환해요:
jsonKeys
["a","b"]
다음 예제는 중첩 JSON 객체에서 키를 가져와요:
source=json_test
| eval jsonKeys = json_keys('{"a": {"c": 1}, "b": 2}')
| head 1
| fields jsonKeys
쿼리는 다음과 같은 결과를 반환해요:
jsonKeys
["a","b"]