在 Amazon Data Firehose 中转换输入数据格式 - Amazon Data Firehose

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

在 Amazon Data Firehose 中转换输入数据格式

在将数据存储在 Amazon S3 之前,Amazon Data Firehose 可以将输入数据的格式从 JSON 转换为 Apache ParquetApache ORC。Parquet 和 ORC 是列式数据格式,与 JSON 等行式格式相比,其可节省空间并更快地启用查询。如果您想要转换 JSON 以外的输入格式,如逗号分隔值(CSV)或结构化文本,您可以先使用 AWS Lambda 来将其转换为 JSON 格式。有关更多信息,请参阅 在 Amazon Data Firehose 中转换源数据

即使您在将记录发送到 Amazon Data Firehose 之前聚合了记录,也可以转换数据的格式。

Amazon Data Firehose 需要以下三个元素才能转换记录数据的格式:

Deserializer

Amazon Data Firehose 需要反串行化器才能读取输入数据的 JSON。您可以选择以下两种类型的反串行化器。

如要将多个 JSON 文档合并到同一记录中,请确保您的输入仍以支持的 JSON 格式显示。JSON 文档数组不是有效输入。

例如,这是正确的输入:{"a":1}{"a":2}

这是错误的输入:[{"a":1}, {"a":2}]

如果您的输入 JSON 包含采用以下格式的时间戳,请选择 OpenX JSON SerDe

  • yyyy-MM-dd'T'HH:mm:ss[.S]'Z',其中小数最多有 9 位,例如:2017-02-07T15:13:01.39256Z

  • yyyy-[M]M-[d]d HH:mm:ss[.S],其中小数最多有 9 位,例如:2017-02-07 15:13:01.14

  • 秒,以纪元格式表示,例如:1518033528

  • 毫秒,以纪元格式表示,例如:1518033528123

  • 浮点秒,以纪元格式表示,例如:1518033528.123

OpenX JSON SerDe 可将句点 (.) 转换为下划线 (_)。它还可以在对 JSON 键进行反串行化前将其转换为小写。有关此反串行化器通过 Amazon Data Firehose 提供的选项的更多信息,请参阅 OpenXJsonSerDe

如果您不确定要选择哪个解串器,请使用 OpenX JSON SerDe,除非您有其不支持的时间戳。

如果您有之前列出的格式以外的时间戳,请使用 Apache Hive JSON SerDe。选择此解串器后,您可以指定要使用的时间戳格式。为此,请遵循 Joda-Time DateTimeFormat 格式字符串的模式语法。有关更多信息,请参阅 Class DateTimeFormat

您还可以使用特殊值 millis 来解析时间戳(毫秒,以纪元格式表示)。如果您不指定格式,Amazon Data Firehose 将默认使用 java.sql.Timestamp::valueOf

Hive JSON SerDe 不允许以下内容:

  • 列名称中的句点 (.)。

  • 类型为 uniontype 的字段。

  • 架构中具有数字类型但属于 JSON 中的字符串的字段。例如,如果架构为 (an int),而且 JSON 为 {"a":"123"},则 Hive SerDe 会出现错误。

Hive SerDe 不将嵌套 JSON 转换为字符串。例如,如果您有 {"a":{"inner":1}},它不会将 {"inner":1} 视为字符串。

架构

Amazon Data Firehose 需要一个架构来确定如何解释该数据。使用 AWS Glue 在 AWS Glue Data Catalog 中创建架构。然后,Amazon Data Firehose 会引用该架构并使用其解释您的输入数据。您可以使用同一架构来配置 Amazon Data Firehose 和分析软件。有关更多信息,请参阅《AWS Glue 开发人员指南》中的填充 AWS Glue 数据目录

注意

在 AWS Glue Data Catalog 中创建的架构应该与输入数据结构相匹配。否则,转换后的数据将不会包含架构中未指定的属性。如果您使用嵌套 JSON,请在架构中使用可镜像 JSON 数据结构的 STRUCT 类型。有关如何使用 STRUCT 类型处理嵌套 JSON 的信息,请参阅本例

重要

对于没有指定大小限制的数据类型,单行中的所有数据的实际限制为 32 MB。

如果您为 CHARVARCHAR 指定长度,则 Firehose 会在读取输入数据时按指定长度截断字符串。如果底层数据字符串较长,则将保持不变。

Serializer

Firehose 需要串行化器将数据转换为目标列式存储格式(Parquet 或 ORC):您可以选择以下两种类型的串行化器之一。

选择的串行化器取决于您的业务需求。要了解有关两个串行化器选项的更多信息,请参阅 ORC SerDeParquet SerDe