

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

# 在 Amazon Data Firehose 中转换输入数据格式
<a name="record-format-conversion"></a>

在将数据存储在 Amazon S3 之前，Amazon Data Firehose 可以将输入数据的格式从 JSON 转换为 [Apache Parquet](https://parquet.apache.org/) 或 [Apache ORC](https://orc.apache.org/)。Parquet 和 ORC 是列式数据格式，与 JSON 等行式格式相比，其可节省空间并更快地启用查询。如果要转换除 JSON 之外的输入格式，例如逗号分隔值 (CSV) 或结构化文本，则可以先使用 AWS Lambda 将其转换为 JSON。有关更多信息，请参阅 [在 Amazon Data Firehose 中转换源数据](data-transformation.md)。

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

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

## Deserializer
<a name="record-format-conversion-deserializer"></a>

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

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

例如，这是正确的输入：`{"a": 1}{"b": 1}`；这是错误的输入：`[{"a":1}, {"a":2}]`。
+ [Apache Hive Json SerDe](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-JSON)
+ [OpenX JSON SerDe](https://github.com/rcongiu/Hive-JSON-Serde)

### 选择 JSON 反串行化器
<a name="record-format-conversion-deserializers"></a>

 SerDe如果您的输入 JSO [N 包含以下格式的时间戳，请选择 OpenX](https://github.com/rcongiu/Hive-JSON-Serde) JSON：
+  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`。
+  秒，以 Epoch 格式表示，例如：`1518033528`。
+  毫秒，以 Epoch 格式表示，例如：`1518033528123`。
+  浮点秒，以 Epoch 格式表示，例如：`1518033528.123`。

OpenX JSON SerDe 可以将句点 (`.`) 转换为下划线 (`_`)。它还可以在对 JSON 键进行反串行化前将其转换为小写。[有关此反序列化器通过 Amazon Data Firehose 提供的选项的更多信息，请参阅打开。XJson SerDe](https://docs.aws.amazon.com/firehose/latest/APIReference/API_OpenXJsonSerDe.html)

如果你不确定要选择哪个反序列化器，请使用 OpenX JSON SerDe，除非你有它不支持的时间戳。

如果您的时间戳格式与之前列出的格式不同，请使用 [Apache Hiv](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-JSON) e JSON。 SerDe选择此解串器后，您可以指定要使用的时间戳格式。为此，请遵循 Joda-Time `DateTimeFormat` 格式字符串的模式语法。有关更多信息，请参阅[类 DateTimeFormat](https://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html)。

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

Hive JSON SerDe 不允许执行以下操作：
+ 列名称中的句点 (`.`)。
+ 类型为 `uniontype` 的字段。
+ 架构中具有数字类型但属于 JSON 中的字符串的字段。例如，如果架构是（整数），而 JSON 是`{"a":"123"}`，则 Hive SerDe 会给出错误。

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

## 架构
<a name="record-format-conversion-schema"></a>

Amazon Data Firehose 需要一个架构来确定如何解释该数据。使用 [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html) 在 AWS Glue Data Catalog中创建架构。然后，Amazon Data Firehose 会引用该架构并使用其解释您的输入数据。您可以使用同一架构来配置 Amazon Data Firehose 和分析软件。有关更多信息，请参阅[《*AWS Glue 开发者指南*》中的 “填充 AWS Glue 数据目录](https://docs.aws.amazon.com/glue/latest/dg/populate-data-catalog.html)”。

**注意**  
在 AWS Glue 数据目录中创建的架构应与输入数据结构相匹配。否则，转换后的数据将不会包含架构中未指定的属性。如果您使用嵌套 JSON，请在架构中使用可镜像 JSON 数据结构的 STRUCT 类型。有关如何使用 STRUCT 类型处理嵌套 JSON 的信息，请参阅[本例](https://docs.aws.amazon.com/athena/latest/ug/openx-json-serde.html#nested-json-serde-example)。

**重要**  
对于未指定大小限制的数据类型，单行中所有数据的实际限制为 32 MBs。  
如果您为 `CHAR` 或 `VARCHAR` 指定长度，则 Firehose 会在读取输入数据时按指定长度截断字符串。如果底层数据字符串较长，则将保持不变。

## Serializer
<a name="record-format-conversion-serializer"></a>

**Firehose 需要串行化器将数据转换为目标列式存储格式（Parquet 或 ORC）**：您可以选择以下两种类型的串行化器之一。
+ [兽人 SerDe](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC)
+ [拼花地板 SerDe](https://cwiki.apache.org/confluence/display/Hive/Parquet)

### 选择串行化器
<a name="record-format-conversion-serializers"></a>

选择的串行化器取决于您的业务需求。[要了解有关这两个序列化器选项的更多信息，请参阅 [ORC SerDe 和 P](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC) arquet。 SerDe](https://cwiki.apache.org/confluence/display/Hive/Parquet)