本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Amazon Data Firehose 中转换输入数据格式
在将数据存储在 Amazon S3 之前,Amazon Data Firehose 可以将输入数据的格式从 JSON 转换为 Apache Parquet
即使您在将记录发送到 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 SerDeDateTimeFormat
格式字符串的模式语法。有关更多信息,请参阅 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。
如果您为 CHAR
或 VARCHAR
指定长度,则 Firehose 会在读取输入数据时按指定长度截断字符串。如果底层数据字符串较长,则将保持不变。
Serializer
Firehose 需要串行化器将数据转换为目标列式存储格式(Parquet 或 ORC):您可以选择以下两种类型的串行化器之一。
选择的串行化器取决于您的业务需求。要了解有关两个串行化器选项的更多信息,请参阅 ORC SerDe