jsonextractindex

jsonextractindex

JSONEXTRACTINDEX 함수는 jsonField에서 'jsonPath'를 평가하고 결과를 'resultsType' 타입으로 반환하며, null 또는 파싱 오류 시 선택적 defaultValue를 사용하는 함수예요.

출처: 문서

본문

jsonField에서 'jsonPath'를 평가하고 결과를 'resultsType' 타입으로 반환하며, null 또는 파싱 오류 시 선택적 defaultValue를 사용해요.

이 함수는 JSONEXTRACTSCALAR를 밀접하게 반영하지만, JSON 인덱스에서 값을 추출하므로 추가 필터링을 푸시다운할 수 있어요.

JSONEXTRACTSCALAR에 비해, 많은 수의 문서 또는 큰 문서에 대한 추출이 필요할 때 가장 유용해요. 필터링이 매우 특정적인 경우 원래 JSONEXTRACTSCALAR 구현이 보통 더 빨라요. 간단한 비교는 초기 PR #11739을 참고하세요.

시그니처 (Signature)

JSONEXTRACTINDEX(jsonField, 'jsonPath', 'resultsType', [defaultValue], [filter])

Arguments Description
jsonField JSON 문서를 포함하는 Identifier/Expression
'jsonPath' JSON 문서에서 값을 읽기 위해 JsonPath 문법을 따름
'resultsType' Pinot 지원 데이터 타입 중 하나: INT, LONG, FLOAT, DOUBLE, BOOLEAN, TIMESTAMP, STRING, INT_ARRAY, LONG_ARRAY, FLOAT_ARRAY, DOUBLE_ARRAY, STRING_ARRAY.
'filter' 일치하지 않는 값을 추출하지 않도록 필터를 푸시다운함, 예: "$.arrField[*].f2" > 2.

'jsonPath'과 `` **'resultsType'`은 리터럴이에요.** Pinot은 이를 식별자와 구분하기 위해 작은따옴표를 사용해요.

사용 예시 (Usage Examples)

이 섹션의 예시는 Batch JSON Quick Start를 기반으로 해요. 특히 WHERE id = 7044874109 행을 쿼리할 거예요:

SELECT repo
from githubEvents 
WHERE id = 7044874109
repo
{"id":115911530,"name":"LimeVista/Tapes","url":"https://api.github.com/repos/LimeVista/Tapes"}

다음 예시는 JSONEXTRACTINDEX 함수 사용법을 보여줘요:

SELECT id, jsonextractindex(repo, '$.name', 'STRING') AS name
FROM githubEvents 
WHERE id = 7044874109
id name
7044874109 LimeVista/Tapes
SELECT id, jsonextractindex(repo, '$.foo', 'STRING', 'dummyValue') AS name
FROM githubEvents 
WHERE id = 7044874109
id name
7044874109 dummyValue
SELECT id, jsonextractindex(repo, '$.name', 'STRING', 'dummyValue', '"$.id" < 10') AS name
FROM githubEvents 
WHERE id = 7044874109
id name
7044874109 LimeVista/Tapes

배열 추출 (Array Extraction)

아래 예시는 표시된 arrayField를 사용할 거예요.

SELECT repo
FROM myTable 
WHERE id = 123
repo
{"id":"xyz"","arrayField": [{"f1": 1, "f2": 2}, {"f1": 3, "f2": 4}, {"f2": 6}, {"f1": 0, "f2": 5}]}

배열 값을 MV로 추출

SELECT id, jsonextractindex(repo, '$.arrayField[*].f1', 'STRING', '[]') AS arrayValues
FROM myTable 
WHERE id = 123
id arrayValues
123 [1, 3, 0]

배열 값에도 필터링이 허용돼요:

SELECT id, jsonextractindex(repo, '$.arrayField[*].f1', 'STRING', '[]', '"$.arrField[*].f2" > 2') AS arrayValues
FROM myTable 
WHERE id = 123
id arrayValues
123 [3, 0]
SELECT id, jsonextractindex(repo, '$.arrayField[*].f1', 'STRING', '[]', '"$.arrField[*].nonExistant" > 99999') AS arrayValues
FROM myTable 
WHERE id = 123
id arrayValues
123 []

더 알아보기 (Learn more)