JSONPath로 작업하기 - SQL 애플리케이션용 Amazon Kinesis Data Analytics 개발자 안내서

문서의 영문과 번역 사이에 충돌이 있는 경우에는 영문 버전을 따릅니다. 번역 버전은 기계 번역을 사용하여 제공합니다.

JSONPath로 작업하기

JSONPath는 JSON 객체의 요소를 쿼리하는 표준화된 방법입니다. JSONPath는 경로 표현식을 사용하여 JSON 문서에서 요소, 중첩된 요소 및 배열을 탐색합니다. JSON에 대한 자세한 내용은 JSON 소개를 참조하십시오.

Amazon Kinesis Data Analytics에서는 애플리케이션의 소스 스키마에 JSONPath 표현식을 사용하여 스트리밍 소스에서 JSON 형식의 데이터가 포함된 데이터 요소를 식별합니다.

스트리밍 데이터를 애플리케이션의 입력 스트림에 매핑하는 방법에 대한 자세한 내용은 스트리밍 소스 요소를 SQL 입력 열에 매핑하기 단원을 참조하십시오.

JSONPath로 JSON 요소에 액세스하기

JSONPath 표현식을 사용하여 JSON 형식 데이터의 다양한 요소에 액세스하는 방법을 알아볼 수 있습니다. 이 단원의 예에서는 소스 스트림에 다음 JSON 레코드가 포함된 것으로 가정합니다.

{ "customerName":"John Doe", "address": { "streetAddress": [ "number":"123", "street":"AnyStreet" ], "city":"Anytown" } "orders": [ { "orderId":"23284", "itemName":"Widget", "itemPrice":"33.99" }, { "orderId":"63122", "itemName":"Gadget", "itemPrice":"22.50" }, { "orderId":"77284", "itemName":"Sprocket", "itemPrice":"12.00" } ] }

JSON 요소에 액세스

JSONPath를 사용하여 JSON 데이터에 있는 요소를 쿼리하려면 다음의 구문을 사용합니다. 여기에서, $는 데이터 계층의 루트를 나타내고 elementName은 쿼리에 대한 요소 노드의 이름입니다.

$.elementName

다음 표현식은 앞의 JSON 예제에 있는 customerName 요소를 쿼리하는 것이다.

$.customerName

앞의 표현식은 앞선 JSON 레코드로부터 다음을 반환합니다.

John Doe
참고

경로 표현식은 대/소문자를 구분합니다. 표현식 $.customername은 앞선 JSON 예제로부터 null을 반환합니다.

참고

경로 표현식이 지정하는 위치에 요소가 표시되지 않으면 표현식 표현식이 null. 다음 표현식 복귀 null 이전 JSON 예제에서 일치하는 요소가 없기 때문입니다.

$.customerId

중첩된 JSON 요소에 대한 액세스

중첩된 JSON 요소를 쿼리하려면 다음 문구를 사용합니다.

$.parentElement.element

다음 표현식은 앞의 JSON 예제에 있는 city 요소를 쿼리하는 것이다.

$.address.city

앞의 표현식은 앞선 JSON 레코드로부터 다음을 반환합니다.

Anytown

다음 문구를 사용하여 하위 요소를 쿼리할 수 있습니다.

$.parentElement.element.subElement

다음 표현식은 앞의 JSON 예제에 있는 street 요소를 쿼리하는 것이다.

$.address.streetAddress.street

앞의 표현식은 앞선 JSON 레코드로부터 다음을 반환합니다.

AnyStreet

배열 액세스

다음과 같은 방법으로 JSON 배열의 데이터에 액세스할 수 있습니다.

  • 배열의 모든 요소를 단일 행으로 검색합니다.

  • 배열의 각 요소를 별도의 행으로 검색합니다.

배열의 모든 요소를 단일 행으로 검색

배열의 전체 콘텐츠를 단일 행으로 쿼리하려면 다음의 구문을 사용합니다.

$.arrayObject[0:]

다음 표현식은 이 단원에 사용된 위의 JSON 예제에 있는 orders 요소의 전체 콘텐츠를 쿼리합니다. 단일 열 단일 행에 있는 배열 콘텐츠를 반환합니다.

$.orders[0:]

앞의 표현식은 이 단원에 사용된 예제 JSON 레코드로부터 다음을 반환합니다.

[{"orderId":"23284","itemName":"Widget","itemPrice":"33.99"},{"orderId":"61322","itemName":"Gadget","itemPrice":"22.50"},{"orderId":"77284","itemName":"Sprocket","itemPrice":"12.00"}]

배열의 모든 요소를 별도의 행으로 검색

배열의 개별 요소를 별도의 행으로 쿼리하려면 다음의 구문을 사용합니다.

$.arrayObject[0:].element

다음 표현식은 위의 JSON 예제에 있는 orderId 요소를 쿼리하는 것으로 각 배열 요소를 별도의 행으로 반환합니다.

$.orders[0:].orderId

위의 표현식은 앞에 나온 JSON 레코드로부터 다음을 반환합니다. 이때 각 데이터 항목은 별도의 행으로 반환됩니다.

23284

63122

77284

참고

비배열 요소를 쿼리하는 표현식이 개별 배열 요소를 쿼리하는 스키마에 포함되어 있는 경우, 비배열 요소는 해당 배열에 있는 각 요소에 대해 반복됩니다. 예를 들어, 위의 JSON 예제에 대한 스키마가 다음의 표현식을 포함하고 있다고 가정해 보겠습니다.

  • $.customerName

  • $.orders[0:].orderId

이 경우, 예제 입력 스트림 요소로부터 반환된 데이터 행은 다음과 비슷할 것입니다. 이때 모든 orderId 요소에 대해 name 요소가 반복됩니다.

John Doe

23284

John Doe

63122

John Doe

77284

참고

Amazon Kinesis Data Analytics에서 배열 표현식에는 다음 제한이 적용됩니다.

  • 배열 표현식에서는 한 가지 수준의 역참조만 지원됩니다. 다음의 표현식 형식은 지원되지 않습니다.

    $.arrayObject[0:].element[0:].subElement
  • 한 가지 배열만 스키마에서 평면화할 수 있습니다. 복수의 어레이는 모든 요소를 어레이에 포함하는 하나의 행으로 참조—반환할 수 있습니다. 그러나 하나의 어레이만 개별 행으로 반환되는 요소의 각각을 가질 수 있습니다.

    다음 형식의 요소를 포함하는 스키마는 유효합니다. 이 형식은 두 번째 어레이의 콘텐츠를 단일 열로 반환합니다. 첫 번째 어레이에 있는 모든 요소에 대해 반복됩니다.

    $.arrayObjectOne[0:].element $.arrayObjectTwo[0:]

    다음 형식의 요소를 포함하는 스키마는 유효하지 않습니다.

    $.arrayObjectOne[0:].element $.arrayObjectTwo[0:].element

기타 고려 사항

JSONPath 작업 시 추가적인 고려 사항은 다음과 같습니다.

  • 애플리케이션 스키마의 JSONPath 표현식에 있는 개별 요소가 배열에 액세스하지 않는 경우, 처리된 각 JSON 레코드에 대해 애플리케이션의 입력 스트림에 단일 행이 생성됩니다.

  • 배열을 평면화할 때(즉, 해당 요소가 개별 행으로 반환됨) 누락된 요소가 있을 경우 인애플리케이션 스트림에 null 값이 생성됩니다.

  • 배열은 항상 하나 이상의 행에 대해 평면화됩니다. 어떤 값도 반환되지 않는 경우(즉, 어레이가 비어 있거나 요소에 대한 쿼리가 없는 경우) 모든 null 값인 단일 행이 반환됩니다.

    다음 표현식은 앞선 JSON 예제로부터 null 값을 지닌 레코드를 반환하는데, 지정된 경로에 일치하는 요소가 없기 때문입니다.

    $.orders[0:].itemId

    앞의 표현식은 앞선 JSON 예제 레코드로부터 다음을 반환합니다.

    null

    null

    null

관련 주제