

# Conversão de dados ao exportar para um bucket do Amazon S3 para RDS
<a name="USER_ExportSnapshot.data-types"></a>

Quando você exporta um snapshot de banco de dados para um bucket do Amazon S3, o Amazon RDS converte os dados para o formato Parquet e exporta e armazena os dados nesse formato. Para ter mais informações sobre o Parquet, consulte o site [Apache Parquet](https://parquet.apache.org/docs/).

O Parquet armazena todos os dados como um dos seguintes tipos primitivos:
+ BOOLEAN
+ INT32
+ INT64
+ INT96
+ FLOAT
+ DOUBLE
+ BYTE\_ARRAY: uma matriz de bytes de comprimento variável, também conhecida como binário
+ FIXED\_LEN\_BYTE\_ARRAY: uma matriz de bytes de comprimento fixo usada quando os valores têm um tamanho constante

Os tipos de dados Parquet são poucos para reduzir a complexidade de leitura e gravação do formato. O Parquet fornece tipos lógicos para estender os tipos primitivos. Um *tipo lógico* é implementado como uma anotação com os dados em um campo de metadados `LogicalType`. A anotação de tipo lógico explica como interpretar o tipo primitivo. 

Quando o tipo lógico `STRING` anota um tipo `BYTE_ARRAY`, ele indica que a matriz de bytes deve ser interpretada como uma string de caracteres codificada em UTF-8. Depois que uma tarefa de exportação é concluída, o Amazon RDS notifica você no caso de ocorrência de uma conversão de string. Os dados subjacentes exportados são sempre os mesmos que os dados da origem. No entanto, devido à diferença de codificação em UTF-8, alguns caracteres podem aparecer diferentes da fonte quando lidos em ferramentas como a Athena.

Para ter mais informações, consulte [Definições de tipos lógicos do Parquet](https://github.com/apache/parquet-format/blob/master/LogicalTypes.md) na documentação do Parquet.

**Topics**
+ [Mapeamento de tipos de dados MySQL e MariaDB para o Parquet](#USER_ExportSnapshot.data-types.MySQL)
+ [Mapeamento de tipo de dados PostgreSQL para Parquet](#USER_ExportSnapshot.data-types.PostgreSQL)

## Mapeamento de tipos de dados MySQL e MariaDB para o Parquet
<a name="USER_ExportSnapshot.data-types.MySQL"></a>

A tabela a seguir mostra o mapeamento dos tipos de dados MySQL e MariaDB para tipos de dados Parquet quando os dados são convertidos e exportados para o Amazon S3.


<table>
<thead>
  <tr><th>Tipo de dados de origem</th><th>Tipo primitivo do Parquet</th><th>Anotação de tipo lógico</th><th>Notas de conversão</th></tr>
</thead>
<tbody>
  <tr><td colspan="4">Tipos de dados numéricos</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>O Parquet é compatível apenas com tipos assinados, portanto, o mapeamento requer um byte adicional (8 mais 1) para armazenar o tipo 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>Se o valor de origem for menor que 231, ele será armazenado como INT32. </td></tr>
  <tr><td>INT64</td><td>DECIMAL (p,s)</td><td>Se o valor de origem for 231 ou maior, mas inferior a 263, ele será armazenado como INT64.</td></tr>
  <tr><td>FIXED\_LEN\_BYTE\_ARRAY(N)</td><td>DECIMAL (p,s)</td><td>Se o valor de origem for 263 ou superior, ele será armazenado como FIXED\_LEN\_BYTE\_ARRAY(N).</td></tr>
  <tr><td>BYTE\_ARRAY</td><td>STRING</td><td>O Parquet não é compatível com precisão decimal maior que 38. O valor decimal é convertido em uma string em um tipo BYTE\_ARRAY e codificado como 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>Se o valor de origem for menor que 231, ele será armazenado como INT32.</td></tr>
  <tr><td>INT64</td><td>DECIMAL (p,s)</td><td>Se o valor de origem for 231 ou maior, mas inferior a 263, ele será armazenado como INT64.</td></tr>
  <tr><td>FIXED\_LEN\_ARRAY(N)</td><td>DECIMAL (p,s)</td><td>Se o valor de origem for 263 ou superior, ele será armazenado como FIXED\_LEN\_BYTE\_ARRAY(N).</td></tr>
  <tr><td>BYTE\_ARRAY</td><td>STRING</td><td>O Parquet não é compatível com precisão numérica maior que 38. Esse valor numérico é convertido em uma string em um tipo BYTE\_ARRAY e codificado como 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">Tipos de dados de string</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">Tipos de dados de data e hora</td></tr>
  <tr><td>DATE</td><td>BYTE\_ARRAY</td><td>STRING</td><td>Uma data é convertida em uma string em um tipo BYTE\_ARRAY e codificada como 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>Um tipo TIME é convertido em uma string em um BYTE\_ARRAY e codificado como 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">Tipos de dados geométricos</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">Tipo de dados do JSON</td></tr>
  <tr><td>JSON </td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
</tbody>
</table>


## Mapeamento de tipo de dados PostgreSQL para Parquet
<a name="USER_ExportSnapshot.data-types.PostgreSQL"></a>

A tabela a seguir mostra o mapeamento de tipos de dados PostgreSQL para tipos de dados Parquet quando os dados são convertidos e exportados para o Amazon S3.


<table>
<thead>
  <tr><th>Tipo de dados do PostgreSQL</th><th>Tipo primitivo do Parquet</th><th>Anotação de tipo lógico</th><th>Notas de mapeamento</th></tr>
</thead>
<tbody>
  <tr><td colspan="4">Tipos de dados numéricos</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>Um tipo DECIMAL é convertido em uma string em um tipo BYTE\_ARRAY e codificado como UTF8.Essa conversão é para evitar complicações devido à precisão dos dados e valores de dados que não são um número (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">String e tipos de dados relacionados</td><td></td></tr>
  <tr><td>ARRAY</td><td>BYTE\_ARRAY</td><td>STRING</td><td>Uma matriz é convertida em uma string e codificada como BINARY (UTF8).<br />Essa conversão é para evitar complicações devido à precisão dos dados, os valores dos dados que não são um número (NaN) e os valores de dados de tempo.</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>TEXT SEARCH</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">Tipos de dados de data e hora</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>TIME WITH TIME ZONE</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 WITH TIME ZONE</td><td>BYTE\_ARRAY</td><td>STRING</td><td></td></tr>
  <tr><td colspan="4">Tipos de dados geométricos</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>PATH</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">Tipos de dados 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">Outros tipos de dados</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> Tipo de dados de rede</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> Tipo de dados de rede</td></tr>
  <tr><td>MACADDR</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>OBJECT IDENTIFIER</td><td>N/D</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>
