JSONPath の操作 - Amazon Kinesis Data Analytics for SQL Applications デベロッパーガイド

新しいプロジェクトでは、Kinesis Data Analytics for Applications 経由で新しい Managed Service for Apache Flink Studio SQL を使用することをお勧めします。Managed Service for Apache Flink Studio は、使いやすさと高度な分析機能を兼ね備えているため、高度なストリーム処理アプリケーションを数分で構築できます。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

JSONPath の操作

注記

2023 年 9 月 12 日以降、SQL 用 Kinesis Data Analytics をまだ使用していない場合、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
注記

Path 式では、大文字と小文字が区別されます。式 ($.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 要素をクエリします。配列の内容は、単一行の 1 つの列で返ります。

$.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 の配列式には、次の制限が適用されます。

  • 配列式でサポートされる参照解除レベルは 1 つのみです。次の式形式はサポートされていません。

    $.arrayObject[0:].element[0:].subElement
  • スキーマにフラット化できる配列は 1 つのみです。複数の配列を参照する場合、配列のすべての要素を含む 1 つの行で返されます。ただし、個々の行として返る各要素には、1 つの配列のみ持つことができます。

    次の形式の要素を含むスキーマは有効です。この形式では、1 つの列として 2 番目の配列の内容が返り、最初の配列の各要素が繰り返されます。

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

    次の形式の要素を含むスキーマは無効です。

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

その他の考慮事項

JSONPath を操作するには、他にも次のような考慮事項があります。

  • アプリケーションスキーマの JSONPath 式に各要素からアクセスされる配列がない場合、処理される JSON レコードごとに単一の行がアプリケーションの入力ストリームに作成されます。

  • 配列がフラット化された場合 (つまり、要素が個別の行として返される場合)、null 値となる欠落した要素はすべてアプリケーション内のストリームで作成されます。

  • 配列は常に少なくとも 1 つの行にフラット化されます。返される値がない場合 (つまり、配列が空またはクエリされている要素が存在しない)、すべての値が null で 1 つの行が返ります。

    次の式では、前述の JSON の例から null 値を含むレコードが返ります。これは、指定のパスに一致する要素がないためです。

    $.orders[0:].itemId

    前述の例では、前述の JSON のサンプルレコードから次のように返ります。

    null

    null

    null

関連トピック