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.
Extraire JSON des données à partir de chaînes
Vous avez peut-être des données source JSON contenant des chaînes codées que vous ne souhaitez pas nécessairement désérialiser dans une table dans Athena. Dans ce cas, vous pouvez toujours exécuter SQL des opérations sur ces données à l'aide des JSON fonctions disponibles dans Presto.
Considérez cette JSON chaîne comme un exemple de jeu de données.
{"name": "Susan Smith",
"org": "engineering",
"projects":
[
{"name":"project1", "completed":false},
{"name":"project2", "completed":true}
]
}
Exemples : propriétés d'extraction
Pour extraire les projects
propriétés name
et de la JSON chaîne, utilisez la json_extract
fonction comme dans l'exemple suivant. La json_extract
fonction prend la colonne contenant la JSON chaîne et la recherche à l'aide d'une JSONPath
expression similaire avec la .
notation par points.
Note
JSONPath
effectue un parcours simple de l'arborescence. Il utilise le $
signe pour indiquer la racine du JSON document, suivi d'un point et d'un élément imbriqué directement sous la racine, tel que. $.name
WITH dataset AS ( SELECT '{"name": "Susan Smith", "org": "engineering", "projects": [{"name":"project1", "completed":false}, {"name":"project2", "completed":true}]}' AS myblob ) SELECT json_extract(myblob, '$.name') AS name, json_extract(myblob, '$.projects') AS projects FROM dataset
La valeur renvoyée est une chaîne JSON codée, et non un type de données Athena natif.
+-----------------------------------------------------------------------------------------------+
| name | projects |
+-----------------------------------------------------------------------------------------------+
| "Susan Smith" | [{"name":"project1","completed":false},{"name":"project2","completed":true}] |
+-----------------------------------------------------------------------------------------------+
Pour extraire la valeur scalaire de la JSON chaîne, utilisez la json_extract_scalar
fonction. Celle-ci est similaire à json_extract
, mais elle renvoie uniquement des valeurs scalaires (booléennes, numériques ou de type chaîne).
Note
N'utilisez pas la fonction json_extract_scalar
sur des tableaux, des mappages ou des structures.
WITH dataset AS ( SELECT '{"name": "Susan Smith", "org": "engineering", "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}' AS myblob ) SELECT json_extract_scalar(myblob, '$.name') AS name, json_extract_scalar(myblob, '$.projects') AS projects FROM dataset
Cette requête renvoie :
+---------------------------+
| name | projects |
+---------------------------+
| Susan Smith | |
+---------------------------+
Pour obtenir le premier élément de la propriété projects
dans l'exemple de tableau, utilisez la fonction json_array_get
et spécifiez la position d'index.
WITH dataset AS ( SELECT '{"name": "Bob Smith", "org": "engineering", "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}' AS myblob ) SELECT json_array_get(json_extract(myblob, '$.projects'), 0) AS item FROM dataset
Elle renvoie la valeur à la position d'index spécifiée dans le tableau JSON encodé.
+---------------------------------------+
| item |
+---------------------------------------+
| {"name":"project1","completed":false} |
+---------------------------------------+
Pour renvoyer un type de chaîne Athena, utilisez l'opérateur []
à l'intérieur d'une expression JSONPath
, puis utilisez la fonction json_extract_scalar
. Pour plus d'informations sur []
, consultez Accédez aux éléments du tableau.
WITH dataset AS ( SELECT '{"name": "Bob Smith", "org": "engineering", "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}' AS myblob ) SELECT json_extract_scalar(myblob, '$.projects[0].name') AS project_name FROM dataset
Elle renvoie le résultat suivant :
+--------------+
| project_name |
+--------------+
| project1 |
+--------------+