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

새 프로젝트의 경우 SQL 애플리케이션용 Kinesis Data Analytics보다 Apache Flink Studio용 새로운 관리형 서비스를 사용하는 것이 좋습니다. Apache Flink Studio용 관리형 서비스는 사용 편의성과 고급 분석 기능을 결합하여 정교한 스트림 처리 애플리케이션을 몇 분 만에 구축할 수 있도록 합니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

JSONPath로 작업하기

참고

2023년 9월 12일 이후에는 Kinesis Data Analytics for SQL의 기존 사용자가 아닌 경우, Kinesis Data Firehose를 소스로 사용하여 새 애플리케이션을 생성할 수 없습니다. 자세한 설명은 제한을 참조하세요.

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을 반환합니다. 다음 표현식은 앞선 JSON 예로부터 null을 반환하는데, 일치하는 요소가 없기 때문입니다.

$.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

관련 항목