使用 JSONPath - 适用于 SQL 应用程序的 Amazon Kinesis Data Analytics 开发人员指南
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

对于新项目,建议您使用新的适用于 Apache Flink Studio 的托管服务,而不是使用适用于 SQL 应用程序的 Kinesis Data Analytics。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
注意

路径表达式区分大小写。表达式 $.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

相关主题