Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Gérer les mises à jour du schéma
Cette section fournit des conseils sur le traitement des mises à jour de schémas pour divers formats de données. Athena est un moteur de schema-on-read requêtes. Cela signifie que lorsque vous créez une table dans Athena, elle s'applique aux schémas lors de la lecture des données. Elle ne modifie ni ne réécrit les données sous-jacentes.
Si vous anticipez des modifications dans les schémas de table, envisagez de les créer dans un format de données qui est adapté à vos besoins. Vos objectifs sont de réutiliser les requêtes Athena existantes dans des schémas qui évoluent et d'éviter les erreurs de concordance de schéma lors de requêtes sur des tables avec des partitions.
Pour atteindre ces objectifs, choisissez un format de données pour la table en fonction de celle-ci dans la rubrique suivante.
Rubriques
Opérations de mise à jour de schéma prises en charge par format de données
Le tableau suivant récapitule les formats de stockage de données et les manipulations de schéma prises en charge correspondantes. Utilisez ce tableau pour vous aider à choisir le format qui vous permettra de continuer à utiliser les requêtes Athena, même lorsque vos schémas évoluent au fil du temps.
Dans ce tableau, notez que Parquet et ORC sont des formats de données en colonnes avec des méthodes d'accès aux colonnes par défaut différentes. Par défaut, Parquet accède aux colonnes par nom et ORC par index (valeur ordinale). Athena fournit donc une SerDe propriété définie lors de la création d'une table pour activer/désactiver la méthode d'accès aux colonnes par défaut, ce qui permet une plus grande flexibilité lors de l'évolution du schéma.
Pour Parquet, la propriété parquet.column.index.access
peut être définie sur true
, ce qui définit la méthode d'accès aux colonnes pour utiliser le numéro ordinal de la colonne. La définition de cette propriété sur false
change la méthode d'accès aux colonnes pour utiliser le nom de colonne. De même, pour ORC, utilisez la propriété orc.column.index.access
pour contrôler la méthode d'accès aux colonnes. Pour de plus amples informations, veuillez consulter Comprendre l'accès aux index pour Apache ORC et Apache Parquet.
CSV et TSV vous permettent d'effectuer toutes les manipulations de schéma, sauf réorganiser les colonnes ou ajouter des colonnes au début de la table. Par exemple, si l'évolution de votre schéma nécessite uniquement que vous renommiez des colonnes, sans les supprimer, vous pouvez choisir de créer vos tables au format CSV ou TSV. Si vous avez besoin de supprimer des colonnes, n'utilisez pas CSV ou TSV. Utilisez plutôt l'un des autres formats pris en charge, de préférence un format en colonnes, comme Parquet ou ORC.
Type de mise à jour de schéma attendue | Récapitulatif | CSV (avec et sans en-têtes) et TSV | JSON | AVRO | PARQUET : Lecture par nom (par défaut) | PARQUET : Lecture par index | ORC : Lecture par index (par défaut) | ORC : Lecture par nom |
---|---|---|---|---|---|---|---|---|
Changement de nom de colonne | Stockez vos données aux formats CSV et TSV, ou aux formats Parquet et ORC ou si elles sont lues par index. | Y | N | N | N | Y | Y | N |
Ajouter des colonnes au début ou au milieu de la table | Stockez vos données aux formats JSON, AVRO, ou aux formats ORC et Parquet si elles sont lues par nom. N'utilisez pas CSV et TSV. | N | Y | Y | Y | N | N | Y |
Ajouter des colonnes à la fin de la table | Stockez vos données aux formats CSV ou TSV, JSON, ORC, AVRO ou Parquet. | Y | Y | Y | Y | Y | Y | Y |
Supprimer des colonnes | Stockez vos données aux formats JSON, AVRO, ou aux formats Parquet et ORC si elles sont lues par nom. N'utilisez pas CSV et TSV. | N | Y | Y | Y | N | N | Y |
Réorganiser des colonnes | Stockez vos données aux formats AVRO, JSON, ou aux formats Parquet et ORC si elles sont lues par nom. | N | Y | Y | Y | N | N | Y |
Modifier le type de données d'une colonne | Stockez vos données dans n'importe quel format, mais testez votre requête dans Athena pour vous assurer que les types de données sont compatibles. Pour Parquet et ORC, la modification d'un type de données fonctionne uniquement pour les tables partitionnées. | Y | Y | Y | Y | Y | Y | Y |
Comprendre l'accès aux index pour Apache ORC et Apache Parquet
PARQUET et ORC sont des formats de stockage de données en colonnes pouvant être lus par index ou par nom. Le stockage de vos données dans l'un ou l'autre de ces formats vous permet d'effectuer toutes les opérations sur les schémas et d'exécuter des requêtes Athena sans erreur de non-concordance de schéma.
-
Athena lit ORC par index par défaut, comme défini dans
SERDEPROPERTIES ( 'orc.column.index.access'='true')
. Pour de plus amples informations, veuillez consulter ORC : Lecture par index. -
Athena lit Parquet par nom par défaut, comme défini dans
SERDEPROPERTIES ( 'parquet.column.index.access'='false')
. Pour de plus amples informations, veuillez consulter Parquet : Lecture par nom.
Comme il s'agit de valeurs par défaut, la spécification de ces SerDe propriétés dans vos CREATE
TABLE
requêtes est facultative, elles sont utilisées implicitement. Lorsqu'elles sont utilisées, elles vous permettent d'exécuter certaines opérations de mise à jour de schéma tout en empêchant d'autres opérations. Pour activer ces opérations, exécutez une autre CREATE TABLE
requête et modifiez les SerDe paramètres.
Note
Les SerDe propriétés ne sont pas automatiquement propagées à chaque partition. Utilisez ALTER TABLE ADD PARTITION
des instructions pour définir les SerDe propriétés de chaque partition. Pour automatiser ce processus, écrivez un script qui exécute les instructions ALTER TABLE ADD PARTITION
.
Les sections suivantes décrivent ces cas en détail.
ORC : Lecture par index
Une table au format ORC est lue par index, par défaut. Ce comportement est défini par la syntaxe suivante :
WITH SERDEPROPERTIES ( 'orc.column.index.access'='true')
La lecture par index vous permet de renommer des colonnes. Mais vous perdez alors la possibilité de supprimer des colonnes ou d'en ajouter au milieu de la table.
Pour que ORC soit lu par son nom, ce qui vous permettra d'ajouter des colonnes au milieu du tableau ou de supprimer des colonnes dans ORC, définissez la SerDe propriété sur false
dans orc.column.index.access
l'CREATE
TABLE
instruction. Dans cette configuration, vous perdrez la possibilité de renommer des colonnes.
Note
Dans la version 2 du moteur Athena, lorsque les tables ORC sont configurées pour être lues par nom, Athena exige que tous les noms de colonnes dans les fichiers ORC soient en minuscules. Comme Apache Spark ne met pas en minuscules les noms de champs lorsqu'il génère des fichiers ORC, Athena risque de ne pas pouvoir lire les données ainsi générées. La solution consiste à renommer les colonnes pour qu'elles soient en minuscules ou à utiliser la version 3 du moteur Athena.
L'exemple suivant montre comment modifier le format ORC pour qu'il soit lu par nom :
CREATE EXTERNAL TABLE orders_orc_read_by_name ( `o_comment` string, `o_orderkey` int, `o_custkey` int, `o_orderpriority` string, `o_orderstatus` string, `o_clerk` string, `o_shippriority` int, `o_orderdate` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
WITH SERDEPROPERTIES ( 'orc.column.index.access'='false')
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/orders_orc/';
Parquet : Lecture par nom
Une table au format Parquet est lue par nom, par défaut. Ce comportement est défini par la syntaxe suivante :
WITH SERDEPROPERTIES ( 'parquet.column.index.access'='false')
La lecture par nom vous permet d'ajouter des colonnes au milieu de la table et de supprimer des colonnes. Mais vous perdez alors la possibilité de renommer des colonnes.
Pour que Parquet soit lu par index, ce qui vous permettra de renommer les colonnes, vous devez créer une table dont la parquet.column.index.access
SerDe propriété est définie sur. true