Alteração do tipo de dados de uma coluna
Convém usar outro tipo de coluna quando o tipo existente não puder mais conter a quantidade de informações necessárias. Por exemplo, os valores de uma coluna de ID podem exceder o tamanho do tipo de dados INT
e exigir o uso do tipo de dados BIGINT
.
Considerações
Ao planejar usar um tipo de dados diferente para uma coluna, leve em consideração os seguintes pontos:
-
Na maioria dos casos, você não pode alterar diretamente o tipo de dados de uma coluna. Em vez disso, você recria a tabela do Athena e define a coluna com o novo tipo de dados.
-
Apenas certos tipos de dados podem ser lidos como outros tipos de dados. Consulte a tabela nesta seção para ver os tipos de dados que podem ser tratados dessa forma.
-
Para dados em formato Parquet e ORC, você não pode usar um tipo de dados diferente para uma coluna se a tabela não estiver particionada.
-
Para tabelas particionadas no Parquet e no ORC, o tipo de coluna de uma partição pode ser diferente do tipo de coluna de outra partição, e o Athena aplicará
CAST
ao tipo desejado, se possível. Para ter mais informações, consulte Evitar erros de não correspondência de esquema para tabelas com partições. -
Para tabelas criadas usando o LazySimpleSerDe apenas, é possível usar a declaração
ALTER TABLE REPLACE COLUMNS
para substituir colunas existentes por um tipo de dados diferente, mas todas as colunas existentes que você deseja manter também devem ser redefinidas na declaração, caso contrário, elas serão excluídas. Para ter mais informações, consulte ALTER TABLE REPLACE COLUMNS. -
Para tabelas Apache Iceberg apenas, você pode usar a declaração ALTER TABLE CHANGE COLUMN para alterar o tipo de dados de uma coluna. A declaração
ALTER TABLE REPLACE COLUMNS
não é suportada para tabelas Iceberg. Para ter mais informações, consulte Evoluir o esquema de tabelas do Iceberg.
Importante
É altamente recomendável testar e verificar suas consultas antes de executar as conversões de tipo de dados. Se o Athena não puder usar o tipo de dados de destino, a consulta CREATE TABLE
poderá falhar.
Usar tipos de dados compatíveis
Sempre que possível, use tipos de dados compatíveis. A tabela a seguir lista os tipos de dados que podem ser tratados como outros tipos de dados:
Tipos de dados originais | Tipos de dados de destino disponíveis |
---|---|
STRING |
BYTE , TINYINT , SMALLINT ,
INT , BIGINT |
BYTE |
TINYINT , SMALLINT , INT ,
BIGINT |
TINYINT |
SMALLINT , INT ,
BIGINT |
SMALLINT |
INT , BIGINT |
INT |
BIGINT |
FLOAT |
DOUBLE |
O exemplo a seguir usa a instrução CREATE TABLE
da tabela orders_json
original para criar uma nova tabela chamada orders_json_bigint
. A nova tabela usa BIGINT
em vez de INT
como tipo de dados para a coluna `o_shippriority`
.
CREATE EXTERNAL TABLE orders_json_bigint ( `o_orderkey` int, `o_custkey` int, `o_orderstatus` string, `o_totalprice` double, `o_orderdate` string, `o_orderpriority` string, `o_clerk` string, `o_shippriority` BIGINT ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://amzn-s3-demo-bucket/orders_json';
A seguinte consulta é executada com êxito, semelhante à consulta SELECT
original, antes que o tipo de dados seja alterado:
Select * from orders_json LIMIT 10;