

# Amazon Ion Hive SerDe
<a name="ion-serde"></a>

您可以使用 Amazon Ion Hive SerDe 查询以 [Amazon Ion](https://amzn.github.io/ion-docs/guides/cookbook.html) 格式存储的数据。Amazon Ion 是一种类型丰富、自描述的开源数据格式。开源 SQL 查询语言 [PartiQL](https://partiql.org/) 中使用的是 Amazon Ion 格式。

Amazon Ion 具有可互换的二进制格式和文本格式。此功能结合了文本的易用性和二进制编码的效率。

若要从 Athena 查询 Amazon Ion 数据，您可以使用 [Amazon Ion Hive SerDe](https://github.com/amzn/ion-hive-serde)，其对 Amazon Ion 数据进行序列化和反序列化操作。反序列化允许您对 Amazon Ion 数据运行查询，或读取数据以便以不同的格式（如 Parquet 或 ORC）写出。序列化允许您通过使用 `CREATE TABLE AS SELECT`（CTAS）或 `INSERT INTO` 查询从现有表中复制数据来生成 Amazon Ion 格式的数据。

**注意**  
由于 Amazon Ion 是 JSON 的超集，因此您可以使用 Amazon Ion Hive SerDe 查询非 Amazon Ion JSON 数据集。与其他 [JSON SerDe 库](https://docs.amazonaws.cn/athena/latest/ug/json-serde.html)不同，Amazon Ion SerDe 不希望每行数据都在一行上。如果您想查询“漂亮打印”格式的 JSON 数据集，或以其他方式采用换行符将字段拆分为一行，则此功能非常有用。

有关使用 Athena 查询 Amazon Ion 的其他信息和示例，请参阅[使用 Amazon Athena 分析 Amazon Ion 数据集](https://www.amazonaws.cn/blogs/big-data/analyze-amazon-ion-datasets-using-amazon-athena/)。

## 序列化库名称
<a name="library-name"></a>

Amazon Ion SerDe 的序列化库名称为 `com.amazon.ionhiveserde.IonHiveSerDe`。有关源代码信息，请参阅 GitHub.com 上的 [Amazon Ion Hive SerDe](https://github.com/amazon-ion/ion-hive-serde)。

## 注意事项和限制
<a name="ion-serde-considerations-and-limitations"></a>
+ **重复的字段** – Amazon Ion 结构是有序的并支持重复字段，而 Hive `STRUCT<>` 和 `MAP<>` 不支持。因此，当您将 Amazon Ion 结构中的重复字段反序列化时，将不确定地选择单个值，而忽略其他值。
+ **不支持外部符号表** – 目前，Athena 不支持外部符号表或下列 Amazon Ion Hive SerDe 属性：
  + `ion.catalog.class`
  + `ion.catalog.file`
  + `ion.catalog.url`
  + `ion.symbol_table_imports`
+ **文件扩展名** – Amazon Ion 使用文件扩展名来确定用于反序列化 Amazon Ion 文件的压缩编解码器。因此，压缩文件必须具有与使用的压缩算法相对应的文件扩展名。例如，如果使用 ZSTD，相应的文件扩展名为 `.zst`。
+ **同类数据** – Amazon Ion 对可用于特定字段值的数据类型没有任何限制。例如，两个不同的 Amazon Ion 文档可能有一个名称相同但数据类型不同的字段。但是，由于 Hive 使用架构，所以您提取到单个 Hive 列的所有值都必须具有相同的数据类型。
+ **映射密钥类型限制** – 您将其他格式的数据序列化到 Amazon Ion 时，请确保映射密钥类型为 `STRING`、`VARCHAR` 或者 `CHAR`。尽管 Hive 允许您使用任何原始数据类型作为映射密钥，[Amazon Ion 符号](https://amzn.github.io/ion-docs/docs/symbols.html)必须是字符串类型。
+ **联合类型** – Athena 目前不支持 Hive [联合类型](https://cwiki.apache.org/confluence/display/hive/languagemanual+types/#LanguageManualTypes-UnionTypesunionUnionTypes)。
+ **双精度数据类型** – Amazon Ion 目前不支持 `double` 数据类型。

**Topics**
+ [序列化库名称](#library-name)
+ [注意事项和限制](#ion-serde-considerations-and-limitations)
+ [创建 Amazon Ion 表](ion-serde-using-create-table.md)
+ [使用 CTAS 和 INSERT INTO 创建 Amazon Ion 表](ion-serde-using-ctas-and-insert-into-to-create-ion-tables.md)
+ [Amazon Ion SerDe 属性参考](ion-serde-using-ion-serde-properties.md)
+ [使用路径提取器](ion-serde-using-path-extractors.md)