Modification du type de données d’une colonne
Vous souhaiterez peut-être utiliser un autre type de colonne lorsque le type existant ne peut plus contenir la quantité d'informations requise. Par exemple, les valeurs d'une colonne ID peuvent dépasser la taille du type de données INT et nécessiter l'utilisation du type de données BIGINT.
Considérations
Lorsque vous envisagez d'utiliser un autre type de données pour une colonne, tenez compte des points suivants :
-
Dans la plupart des cas, vous ne pouvez pas modifier directement le type de données d'une colonne. À la place, vous recréez la table Athena et définissez la colonne avec le nouveau type de données.
-
Seuls certains types de données peuvent être lus dans d'autres types de données. Consultez la table de cette section pour les types de données qui peuvent traités de cette manière.
-
Pour les données au format Parquet et ORC, vous ne pouvez pas utiliser un autre type de données pour une colonne si la table n'est pas partitionnée.
-
Pour les tables partitionnées dans Parquet et ORC, le type de colonne d'une partition peut être différent de celui d'une autre partition, et Athena convertira (
CAST) au type souhaité, si possible. Pour plus d’informations, consultez Éviter les erreurs de non-correspondance de schéma pour les tables avec des partitions. -
Pour les tables créées uniquement à l'aide de LazySimpleSerde, il est possible d'utiliser l'instruction
ALTER TABLE REPLACE COLUMNSpour remplacer les colonnes existantes par un autre type de données, mais toutes les colonnes existantes que vous souhaitez conserver doivent également être redéfinies dans l'instruction, sinon elles seront supprimées. Pour de plus amples informations, consultez ALTER TABLE REPLACE COLUMNS. -
Pour les tables Apache Iceberg uniquement, vous pouvez utiliser l'instruction ALTER TABLE CHANGE COLUMNpour modifier le type de données d'une colonne.
ALTER TABLE REPLACE COLUMNSn'est pas pris en charge pour les tables Iceberg. Pour de plus amples informations, consultez Modification du schéma de table Iceberg.
Important
Nous vous recommandons vivement de tester et de vérifier vos requêtes avant d'effectuer des conversions de type de données. Si Athena ne peut pas utiliser le type de données cible, la requête CREATE TABLE risque d'échouer.
Utilisation de types de données compatibles
Dans la mesure du possible, utilisez des types de données compatibles. Le tableau suivant répertorie les types de données dont le traitement est semblable à celui d’autres types de données :
| Type de données d'origine | Types de données cibles disponibles |
|---|---|
STRING |
BYTE, TINYINT, SMALLINT,
INT, BIGINT |
BYTE |
TINYINT, SMALLINT, INT,
BIGINT |
TINYINT |
SMALLINT, INT,
BIGINT |
SMALLINT |
INT, BIGINT |
INT |
BIGINT |
FLOAT |
DOUBLE |
L'exemple suivant utilise l'instruction CREATE TABLE de la table orders_json d'origine pour créer une nouvelle table appelée orders_json_bigint. La nouvelle table utilise BIGINT plutôt que INT comme type de données pour la colonne `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';
La requête suivante s'exécute correctement, comme dans la requête SELECT d'origine, avant le changement du type de données :
Select * from orders_json LIMIT 10;