

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon Data Firehose 中轉換輸入資料格式
<a name="record-format-conversion"></a>

Amazon Data Firehose 可以將輸入資料的格式從 JSON 轉換為 [Apache Parquet](https://parquet.apache.org/) 或 [Apache ORC](https://orc.apache.org/)，然後再將資料儲存在 Amazon S3 中。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>

若您的輸入 JSON 內含下列格式的時間戳記，請選擇 [OpenX JSON SerDe](https://github.com/rcongiu/Hive-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`。
+  Epoch 秒 – 例如：`1518033528`。
+  Epoch 毫秒 – 例如：`1518033528123`。
+  浮點 epoch 秒 – 例如：`1518033528.123`。

OpenX JSON SerDe 可將小數點 (`.`) 轉換為底線 (`_`)，也可將 JSON 金鑰轉換為小寫，再加以還原序列。如需透過 Amazon Data Firehose 與此還原序列化程式搭配使用之選項的詳細資訊，請參閱 [OpenXJsonSerDe](https://docs.aws.amazon.com/firehose/latest/APIReference/API_OpenXJsonSerDe.html)。

若您不確定應選擇何種還原序列化程式，請使用 OpenX JSON SerDe，除非其中具有不支援的時間戳記。

若您時間戳記的格式並未列於上述，請使用 [Apache Hive JSON SerDe](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-JSON)。選擇此還原序列化程式後，您可指定欲使用的時間戳記格式，方法是遵循 Joda-Time `DateTimeFormat` 格式字串的模式語法。如需詳細資訊，請參閱 [Class 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 中字串的欄位，例如，若結構描述為整數 (int) 且 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 Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/populate-data-catalog.html)。

**注意**  
在 AWS Glue Data Catalog 中建立的結構描述應與輸入資料結構相符。否則，已轉換資料將不會包含結構描述中未指定的屬性。如果您使用巢狀 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)** – 您可以選擇下列兩種類型的序列化程式之一。
+ [ORC SerDe](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC)
+ [Parquet SerDe](https://cwiki.apache.org/confluence/display/Hive/Parquet)

### 選擇序列化程式
<a name="record-format-conversion-serializers"></a>

您選擇的序列化程式取決於您的商業需求。欲進一步了解序列化程式的兩種選項，請參閱 [ORC SerDe](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC) 和 [Parquet SerDe](https://cwiki.apache.org/confluence/display/Hive/Parquet)。