

# Amazon RDS 导出到 Amazon S3 存储桶时的数据转换
<a name="USER_ExportSnapshot.data-types"></a>

将数据库快照导出到 Amazon S3 存储桶时，Amazon RDS 以 Parquet 格式转换数据、导出数据并存储数据。有关 Parquet 的更多信息，请参阅 [Apache Parquet](https://parquet.apache.org/docs/) 网站。

Parquet 将所有数据存储为以下原始类型之一：
+ BOOLEAN
+ INT32
+ INT64
+ INT96
+ FLOAT
+ DOUBLE
+ BYTE\_ARRAY – 一个可变长度的字节数组，也称为二进制
+ FIXED\_LEN\_BYTE\_ARRAY – 当值具有恒定大小时使用的固定长度字节数组

Parquet 数据类型很少能减少读取和写入格式的复杂性。Parquet 提供了用于扩展原始类型的逻辑类型。*逻辑类型*实现为具有 `LogicalType` 元数据字段中数据的注释。逻辑类型注释说明如何解释原始类型。

当 `STRING` 逻辑类型注释 `BYTE_ARRAY` 类型时，它表示字节数组应被解释为 UTF-8 编码的字符串。导出任务完成后，如果发生了任何字符串转换，则 Amazon RDS 会通知您。导出的基础数据始终与源中的数据相同。但是，由于 UTF-8 中的编码差异，在工具（如 Athena）中读取时，某些字符可能会显示与源不同。

有关更多信息，请参阅 Parquet 文档中的 [Parquet 逻辑类型定义](https://github.com/apache/parquet-format/blob/master/LogicalTypes.md)。

**Topics**
+ [MySQL 和 MariaDB 数据类型到 Parquet 的映射](#USER_ExportSnapshot.data-types.MySQL)
+ [PostgreSQL 数据类型到 Parquet 的映射](#USER_ExportSnapshot.data-types.PostgreSQL)

## MySQL 和 MariaDB 数据类型到 Parquet 的映射
<a name="USER_ExportSnapshot.data-types.MySQL"></a>

下表显示在将数据转换并导出到 Amazon S3 时从 MySQL 和 MariaDB 数据类型到 Parquet 数据类型的映射。


<table>
<thead>
  <tr><th>源数据类型</th><th>Parquet 原始类型</th><th>逻辑类型注释</th><th>转换说明</th></tr>
</thead>
<tbody>
  <tr><td colspan="4">数字数据类型</td></tr>
  <tr><td>BIGINT</td><td>INT64</td><td></td><td> </td></tr>
  <tr><td>BIGINT UNSIGNED</td><td>FIXED\_LEN\_BYTE\_ARRAY(9) </td><td>DECIMAL(20,0)</td><td>Parquet 仅支持签名类型，因此映射需要额外的字节（8 加 1）来存储 BIGINT\_UNSIGNED 类型。</td></tr>
  <tr><td>BIT</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td rowspan="4">DECIMAL</td><td>INT32</td><td>DECIMAL (p,s)</td><td>如果源值小于 231，它其存储为 INT32。</td></tr>
  <tr><td>INT64</td><td>DECIMAL (p,s)</td><td>如果源值等于或大于 231，但小于 263，它将存储为 INT64。</td></tr>
  <tr><td>FIXED\_LEN\_BYTE\_ARRAY(N)</td><td>DECIMAL (p,s)</td><td>如果源值等于或大于 263，则将它存储为 FIXED\_LEN\_BYTE\_ARRAY(N)。</td></tr>
  <tr><td>BYTE\_ARRAY</td><td>STRING</td><td>Parquet 不支持大于 38 的小数精度。十进制值转换为 BYTE\_ARRAY 类型的字符串，并编码为 UTF8。</td></tr>
  <tr><td>DOUBLE</td><td>DOUBLE</td><td></td><td> </td></tr>
  <tr><td>FLOAT</td><td>DOUBLE</td><td></td><td> </td></tr>
  <tr><td>INT</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>INT UNSIGNED</td><td>INT64</td><td></td><td> </td></tr>
  <tr><td>MEDIUMINT</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>MEDIUMINT UNSIGNED</td><td>INT64</td><td></td><td> </td></tr>
  <tr><td rowspan="4"> NUMERIC</td><td>INT32</td><td>DECIMAL (p,s)</td><td>如果源值小于 231，它其存储为 INT32。</td></tr>
  <tr><td>INT64</td><td>DECIMAL (p,s)</td><td>如果源值等于或大于 231，但小于 263，它将存储为 INT64。</td></tr>
  <tr><td>FIXED\_LEN\_ARRAY(N)</td><td>DECIMAL (p,s)</td><td>如果源值等于或大于 263，则将它存储为 FIXED\_LEN\_BYTE\_ARRAY(N)。</td></tr>
  <tr><td>BYTE\_ARRAY</td><td>STRING</td><td>Parquet 不支持大于 38 的数值精度。此数值类型的值转换为 BYTE\_ARRAY 类型的字符串，并编码为 UTF8。</td></tr>
  <tr><td>SMALLINT</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>SMALLINT UNSIGNED</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>TINYINT</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>TINYINT UNSIGNED</td><td>INT32</td><td>INT(16, true)</td><td> </td></tr>
  <tr><td colspan="4">字符串数据类型</td></tr>
  <tr><td>BINARY</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>BLOB</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>CHAR</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>ENUM</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>LINESTRING</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>LONGBLOB</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>LONGTEXT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>MEDIUMBLOB</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>MEDIUMTEXT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>MULTILINESTRING</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>SET</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>TEXT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>TINYBLOB</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>TINYTEXT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>VARBINARY</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>VARCHAR</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td colspan="4">日期和时间数据类型</td></tr>
  <tr><td>DATE</td><td>BYTE\_ARRAY</td><td>STRING</td><td>日期将转换为 BYTE\_ARRAY 类型的字符串，并编码为 UTF8。</td></tr>
  <tr><td>DATETIME</td><td>INT64 </td><td>TIMESTAMP\_MICROS</td><td> </td></tr>
  <tr><td>TIME</td><td>BYTE\_ARRAY</td><td>STRING</td><td>TIME 类型转换为 BYTE\_ARRAY 类型的字符串，并编码为 UTF8。</td></tr>
  <tr><td>TIMESTAMP</td><td>INT64 </td><td>TIMESTAMP\_MICROS</td><td> </td></tr>
  <tr><td>YEAR</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td colspan="4">几何数据类型</td></tr>
  <tr><td>GEOMETRY</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>GEOMETRYCOLLECTION</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>MULTIPOINT</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>MULTIPOLYGON</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>POINT</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>POLYGON</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td colspan="4">JSON 数据类型</td></tr>
  <tr><td>JSON </td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
</tbody>
</table>


## PostgreSQL 数据类型到 Parquet 的映射
<a name="USER_ExportSnapshot.data-types.PostgreSQL"></a>

下表显示在将数据转换并导出到 Amazon S3 时从 PostgreSQL 数据类型到 Parquet 数据类型的映射。


<table>
<thead>
  <tr><th>PostgreSQL 数据类型</th><th>Parquet 原始类型</th><th>逻辑类型注释</th><th>映射注释</th></tr>
</thead>
<tbody>
  <tr><td colspan="4">数字数据类型</td></tr>
  <tr><td>BIGINT</td><td>INT64</td><td></td><td> </td></tr>
  <tr><td>BIGSERIAL</td><td>INT64</td><td></td><td> </td></tr>
  <tr><td>DECIMAL</td><td>BYTE\_ARRAY</td><td>STRING</td><td>DECIMAL 类型转换为 BYTE\_ARRAY 类型的字符串，并编码为 UTF8。此转换是为了避免由于数据精度和非数字 (NaN) 的数据值而引起的复杂性。</td></tr>
  <tr><td>DOUBLE PRECISION</td><td>DOUBLE</td><td></td><td> </td></tr>
  <tr><td>INTEGER</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>MONEY</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>REAL</td><td>FLOAT</td><td></td><td> </td></tr>
  <tr><td>SERIAL</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>SMALLINT</td><td>INT32</td><td>INT(16, true)</td><td> </td></tr>
  <tr><td>SMALLSERIAL</td><td>INT32</td><td>INT(16, true)</td><td> </td></tr>
  <tr><td colspan="3">字符串和相关数据类型</td><td></td></tr>
  <tr><td>ARRAY</td><td>BYTE\_ARRAY</td><td>STRING</td><td>数组转换为字符串并编码为 BINARY (UTF8)。<br />此转换是为了避免因数据精度、非数字 (NaN) 的数据值和时间数据值而产生的复杂性。</td></tr>
  <tr><td>BIT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>BIT VARYING</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>BYTEA</td><td>BINARY</td><td></td><td> </td></tr>
  <tr><td>CHAR</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>CHAR(N)</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>ENUM</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>NAME</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>TEXT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>文本搜索</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>VARCHAR(N)</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>XML</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td colspan="4">日期和时间数据类型</td></tr>
  <tr><td>DATE</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>INTERVAL</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>TIME</td><td>BYTE\_ARRAY</td><td>STRING</td><td></td></tr>
  <tr><td>带时区的时间</td><td>BYTE\_ARRAY</td><td>STRING</td><td></td></tr>
  <tr><td>TIMESTAMP</td><td>BYTE\_ARRAY</td><td>STRING</td><td></td></tr>
  <tr><td>TIMESTAMP（有时区）</td><td>BYTE\_ARRAY</td><td>STRING</td><td></td></tr>
  <tr><td colspan="4">几何数据类型</td></tr>
  <tr><td>BOX</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>CIRCLE</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>LINE</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>LINESEGMENT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>路径</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>POINT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>POLYGON</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td colspan="4">JSON 数据类型</td></tr>
  <tr><td>JSON</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>JSONB</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td colspan="4">其他数据类型</td></tr>
  <tr><td>BOOLEAN</td><td>BOOLEAN</td><td></td><td> </td></tr>
  <tr><td>CIDR</td><td>BYTE\_ARRAY</td><td>STRING</td><td> 网络数据类型</td></tr>
  <tr><td>COMPOSITE</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>DOMAIN</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>INET</td><td>BYTE\_ARRAY</td><td>STRING</td><td> 网络数据类型</td></tr>
  <tr><td>MACADDR</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>对象标识符</td><td>不适用</td><td></td><td></td></tr>
  <tr><td>PG\_LSN</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>RANGE</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>UUID</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
</tbody>
</table>
