经过仔细考虑,我们决定分两个步骤停止使用亚马逊 Kinesis Data Analytics SQL 的应用程序:
1. 从 2025 年 10 月 15 日起,您将无法为应用程序创建新的 Kinesis Data Analytic SQL s。
2. 从 2026 年 1 月 27 日起,我们将删除您的应用程序。您将无法启动或操作适用于应用程序的 Amazon Kinesis Data Analytic SQL s。从那时起,亚马逊 Kinesis Data Analytics SQL 将不再提供支持。有关更多信息,请参阅 适用于应用程序的 Amazon Kinesis Data Analytic SQL s 停产。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 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
在这种情况下,从示例输入流元素返回的数据行将类似于以下内容 (其中的 name
元素将针对每个 orderId
元素重复)。
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