Interrogation des données JSON - Amazon Athena

Interrogation des données JSON

Amazon Athena vous permet d’interroger des données codées en JSON, d’extraire des données de JSON imbriqués, de rechercher des valeurs et de déterminer la longueur et la taille de tableaux JSON. Les exemples suivants de données relatives à des planètes vous aideront à comprendre les principes de base de l’interrogation de données JSON dans Athena :

{name:"Mercury",distanceFromSun:0.39,orbitalPeriod:0.24,dayLength:58.65} {name:"Venus",distanceFromSun:0.72,orbitalPeriod:0.62,dayLength:243.02} {name:"Earth",distanceFromSun:1.00,orbitalPeriod:1.00,dayLength:1.00} {name:"Mars",distanceFromSun:1.52,orbitalPeriod:1.88,dayLength:1.03}

Vous remarquerez que chaque enregistrement (chaque ligne de la table) se trouve sur une ligne distincte. Pour interroger ces données JSON, vous pouvez utiliser une instruction CREATE TABLE de ce type :

CREATE EXTERNAL TABLE `planets_json`( `name` string, `distancefromsun` double, `orbitalperiod` double, `daylength` double) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/json/'

Pour interroger les données, utilisez une instruction SELECT simple semblable à celle présentée dans l’exemple ci-dessous :

SELECT * FROM planets_json

Les résultats de la requête se présentent comme suit :

# name distancefromsun orbitalperiod daylength
1 Mercury 0.39 0.24 58.65
2 Venus 0.72 0.62 243.02
3 Earth 1.0 1.0 1.0
4 Mars 1.52 1.88 1.03

Vous remarquez que l’instruction CREATE TABLE utilise le SerDe JSON OpenX, ce qui nécessite que chaque enregistrement JSON se trouve sur une ligne distincte. Si le JSON est au format d’impression ou si tous les enregistrements se trouvent sur une seule ligne, les données ne seront pas lues correctement.

Pour interroger des données JSON au format d’impression, vous pouvez utiliser le SerDe Amazon Ion Hive lieu du SerDe JSON OpenX. Examinez les données précédentes stockées au format d’impression :

{ name:"Mercury", distanceFromSun:0.39, orbitalPeriod:0.24, dayLength:58.65 } { name:"Venus", distanceFromSun:0.72, orbitalPeriod:0.62, dayLength:243.02 } { name:"Earth", distanceFromSun:1.00, orbitalPeriod:1.00, dayLength:1.00 } { name:"Mars", distanceFromSun:1.52, orbitalPeriod:1.88, dayLength:1.03 }

Pour interroger ces données sans procéder à une remise en forme, vous pouvez utiliser une instruction CREATE TABLE semblable à celle présentée dans l’exemple ci-dessous. Notez que l’instruction spécifie STORED AS ION au lieu du SerDe JSON OpenX.

CREATE EXTERNAL TABLE `planets_ion`( `name` string, `distancefromsun` DECIMAL(10, 2), `orbitalperiod` DECIMAL(10, 2), `daylength` DECIMAL(10, 2)) STORED AS ION LOCATION 's3://amzn-s3-demo-bucket/json-ion/'

La requête SELECT * FROM planets_ion produit les mêmes résultats que précédemment. Pour plus d’informations sur la création de tables selon ce procédé à l’aide du SerDe Amazon Ion Hive, consultez Création de tables Amazon Ion.

L’exemple de données JSON précédent ne contient pas de types de données complexes tels que des tableaux ou des structures imbriqués. Pour plus d’informations sur l’interrogation de données JSON imbriquées, consultez Exemple : désérialisation des données JSON imbriquées.