慎重な検討の結果、Amazon Kinesis Data Analytics for SQL アプリケーションのサポートは終了することになりました。サポート終了は次の 2 段階で行われます。
1. 2025 年 10 月 15 日以降、新しい Kinesis Data Analytics for SQL アプリケーションを作成することはできなくなります。
2. 2026 年 1 月 27 日以降、アプリケーションは削除されます。Amazon Kinesis Data Analytics for SQL アプリケーションを起動することも操作することもできなくなります。これ以降、Amazon Kinesis Data Analytics for SQL のサポートは終了します。詳細については、「Amazon Kinesis Data Analytics for SQL アプリケーションのサポート終了」を参照してください。
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
注記
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