读取 JSON 数据的最佳实践 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

读取 JSON 数据的最佳实践

JavaScript 对象表示法 (JSON) 是将数据结构编码为文本的常用方法。许多应用程序和工具输出 JSON 编码的数据。

在 Amazon Athena 中,您可以从外部数据创建表,并在其中包含 JSON 编码的数据。对于此类类型的源数据,请将 Athena 与 JSON SerDe 库 结合使用。

使用以下提示来读取 JSON 编码的数据:

  • 选择正确的 SerDe、本机 JSON SerDe、org.apache.hive.hcatalog.data.JsonSerDe 或 OpenX SerDe、org.openx.data.jsonserde.JsonSerDe。有关更多信息,请参阅JSON SerDe 库

  • 确保每个 JSON 编码的记录表示在单独的行上,而不是采用美观的打印格式。

    注意

    SerDe 期望每个 JSON 文档都位于单行文本中,并且不使用行终止字符分隔记录中的字段。如果 JSON 文本采用美观的打印格式,当您在创建表后尝试对其进行查询时,可能会收到类似以下内容的错误消息:HIVE_CURSOR_ERROR: Row is not a valid JSON Object(HIVE_CURSOR_ERROR:行不是有效的 JSON 对象)或 HIVE_CURSOR_ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT(HIVE_CURSOR_ERROR:JsonParseException:意外的输入结束:对象的预期关闭标记)。有关更多信息,请参阅 GitHub 上 OpenX SerDe 文档中的 JSON 数据文件

  • 在不区分大小写的列中生成 JSON 编码的数据。

  • 提供用于忽略格式错误的记录的选项,如本示例中所示。

    CREATE EXTERNAL TABLE json_table ( column_a string, column_b int ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true') LOCATION 's3://bucket/path/';
  • 将源数据中具有待定架构的字段转换为 Athena 中的 JSON 编码字符串。

当 Athena 创建由 JSON 数据提供支持的表时,它会基于现有的和预定义的架构解析数据。但并非您的所有数据都可能具有预定义的架构。要在这种情况下简化架构管理,通常有用的做法是将源数据中具有不确定架构的字段转换为 Athena 中的 JSON 字符串,然后使用 JSON SerDe 库

例如,请考虑一个从不同传感器发布具有公共字段的事件的 IoT 应用程序。其中一个字段必须存储一个对发送事件的传感器唯一的自定义有效负载。在这种情况下,因为您不知道架构,我们建议您将信息存储为 JSON 编码的字符串。为此,请将 Athena 表中的数据转换为 JSON,如下例所示。您还可以将 JSON 编码的数据转换为 Athena 数据类型。

将 Athena 数据类型转换为 JSON

要将 Athena 数据转换为 JSON 数据类型,请使用 CAST

WITH dataset AS ( SELECT CAST('HELLO ATHENA' AS JSON) AS hello_msg, CAST(12345 AS JSON) AS some_int, CAST(MAP(ARRAY['a', 'b'], ARRAY[1,2]) AS JSON) AS some_map ) SELECT * FROM dataset

此查询返回:

+-------------------------------------------+ | hello_msg | some_int | some_map | +-------------------------------------------+ | "HELLO ATHENA" | 12345 | {"a":1,"b":2} | +-------------------------------------------+

将 JSON 转换为 Athena 数据类型

要将 JSON 数据转换为 Athena 数据类型,请使用 CAST

注意

在本示例中,为将字符串表示为 JSON 编码,一开始就使用 JSON 关键字并使用单引号,例如 JSON '12345'

WITH dataset AS ( SELECT CAST(JSON '"HELLO ATHENA"' AS VARCHAR) AS hello_msg, CAST(JSON '12345' AS INTEGER) AS some_int, CAST(JSON '{"a":1,"b":2}' AS MAP(VARCHAR, INTEGER)) AS some_map ) SELECT * FROM dataset

此查询返回:

+-------------------------------------+ | hello_msg | some_int | some_map | +-------------------------------------+ | HELLO ATHENA | 12345 | {a:1,b:2} | +-------------------------------------+