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 C ORC sont des formats en colonnes avec différentes méthodes d'accès aux colonnes par défaut. 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 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 utiliser la orc.column.index.access
propriété 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.
CSVet vous TSV permettent d'effectuer toutes les manipulations du schéma, à l'exception de la réorganisation des colonnes ou de l'ajout de colonnes au début du tableau. Par exemple, si l'évolution de votre schéma nécessite uniquement de renommer les colonnes sans les supprimer, vous pouvez choisir de créer vos tables dans CSV ouTSV. Si vous devez 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, tel que Parquet ouORC.
Mises à jour de schéma et formats de données dans Athena | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Type de mise à jour de schéma attendue | Récapitulatif | CSV(avec et sans en-têtes) et TSV | JSON | AVRO | PARQUET: Lire par nom (par défaut) | PARQUET: Lecture par index | ORC: lecture par index (par défaut) | ORC: lu par nom | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Changement de nom de colonne | Stockez vos données dans CSV et TSV ou dans ORC Parquet 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 dans JSONAVRO, ou dans Parquet et ORC si elles sont lues nominativement. Ne pas utiliser CSV etTSV. | N | Y | Y | Y | N | N | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ajouter des colonnes à la fin de la table | Stockez vos données dans CSV orTSV,JSON, AVROORC, ou Parquet. | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Supprimer des colonnes | Stockez vos données dans JSONAVRO, ou Parquet etORC, si elles sont lues par leur nom. Ne pas utiliser CSV etTSV. | N | Y | Y | Y | N | N | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Réorganiser des colonnes | Stockez vos données dans AVRO JSON ou ORC dans Parquet si elles sont lues nominativement. | 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 etORC, la modification d'un type de données ne fonctionne que pour les tables partitionnées. | Y | Y | Y | Y | Y | Y | Y |
Comprendre l'accès aux index pour Apache ORC et Apache Parquet
PARQUETet ORC sont des formats de stockage de données en colonnes qui peuvent ê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
Par défaut, une table ORCest lue par index. 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 effectuer une ORC lecture par nom, ce qui vous permettra d'ajouter des colonnes au milieu du tableau ou d'en supprimerORC, définissez la SerDe propriété orc.column.index.access
sur false
dans l'CREATE
TABLE
instruction. Dans cette configuration, vous perdrez la possibilité de renommer des colonnes.
Note
Dans la version 2 du moteur Athena, lorsque ORC les tables sont définies pour être lues par nom, Athena exige que tous les noms de colonnes des ORC fichiers soient en minuscules. Comme Apache Spark ne met pas les noms de champs en minuscules lorsqu'il génère des ORC fichiers, Athena risque de ne pas être en mesure de 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 ORC pour qu'il soit lu par son 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