经过仔细考虑,我们决定停用适用于 SQL 应用程序的亚马逊 Kinesis 数据分析:
1. 从 2025 年 9 月 1 日起,我们将不再为适用于 SQL 应用程序的 Amazon Kinesis 数据分析提供任何错误修复,因为鉴于即将停产,我们对它的支持将有限。
2. 从 2025 年 10 月 15 日起,您将无法为 SQL 应用程序创建新的 Kinesis 数据分析。
3. 从 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 简介
亚马逊 Kinesis 数据分析在应用程序的源架构中使用 JsonPath 表达式来识别包含数据的流源中的数据元素。 JSON-format
有关如何将流式数据映射到应用程序输入流的更多信息,请参阅将流式传输源元素映射到 SQL 输入列。
使用 JSONPath 访问 JSON 元素
下面,你可以找到如何使用 JsonPath 表达式来访问数据中的 JSON-formatted 各种元素。对于此部分中的示例,请假设源流包含以下 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