Sélectionner vos préférences de cookies

Nous utilisons des cookies essentiels et des outils similaires qui sont nécessaires au fonctionnement de notre site et à la fourniture de nos services. Nous utilisons des cookies de performance pour collecter des statistiques anonymes afin de comprendre comment les clients utilisent notre site et d’apporter des améliorations. Les cookies essentiels ne peuvent pas être désactivés, mais vous pouvez cliquer sur « Personnaliser » ou « Refuser » pour refuser les cookies de performance.

Si vous êtes d’accord, AWS et les tiers approuvés utiliseront également des cookies pour fournir des fonctionnalités utiles au site, mémoriser vos préférences et afficher du contenu pertinent, y compris des publicités pertinentes. Pour accepter ou refuser tous les cookies non essentiels, cliquez sur « Accepter » ou « Refuser ». Pour effectuer des choix plus détaillés, cliquez sur « Personnaliser ».

OpenX JSON SerDe

Mode de mise au point
OpenX JSON SerDe - Amazon Athena

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.

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.

Comme le JSON Hive SerDe, vous pouvez utiliser le JSON OpenX pour traiter les données JSON. Les données sont également représentées sous forme de chaînes sur une ligne de texte codées en JSON et séparées par une nouvelle ligne. Comme le JSON Hive SerDe, le JSON OpenX SerDe n'autorise pas la duplication de clés struct ou de noms map de clés.

Considérations et restrictions

  • Lorsque vous utilisez le JSON OpenX SerDe, le nombre de résultats et leurs valeurs peuvent être non déterministes. Les résultats peuvent contenir plus de lignes que prévu, moins de lignes que prévu ou des valeurs nulles inattendues lorsqu'aucune n'est présente dans les données sous-jacentes. Pour contourner ce problème, utilisez le Hive JSON SerDe ou réécrivez les données dans un autre format de fichier.

  • Il SerDe s'attend à ce que chaque document JSON se trouve sur une seule ligne de texte sans aucun caractère de fin de ligne séparant les champs de l'enregistrement. Si le texte JSON est dans un joli format d'impression, vous pouvez recevoir un message d'erreur tel que HIVE_CURSOR_ERROR : Row is not a valid JSON Object ou HIVE_CURSOR_ERROR : : Unexpected JsonParseException end-of-input : expected close marker for OBJECT lorsque vous essayez d'interroger la table après l'avoir créée.

    Pour plus d'informations, consultez la section Fichiers de données JSON dans la SerDe documentation OpenX sur. GitHub

Propriétés facultatives

Contrairement au JSON Hive SerDe, le JSON OpenX SerDe possède également les propriétés SerDe facultatives suivantes qui peuvent être utiles pour corriger les incohérences dans les données.

ignore.malformed.json

Facultatif. Lorsque la valeur est définie sur TRUE, cela vous permet d'ignorer la syntaxe JSON incorrecte. L’argument par défaut est FALSE.

dots.in.keys

Facultatif. L’argument par défaut est FALSE. Lorsqu'il est défini surTRUE, permet de remplacer SerDe les points dans les noms des clés par des traits de soulignement. Par exemple, si le jeu de données JSON contient une clé portant le nom "a.b", vous pouvez utiliser cette propriété pour définir le nom de la colonne comme étant "a_b" dans Athena. Par défaut (sans cela SerDe), Athena n'autorise pas les points dans les noms de colonnes.

case.insensitive

Facultatif. L’argument par défaut est TRUE. Lorsqu'il est défini surTRUE, il SerDe convertit toutes les colonnes majuscules en minuscules.

Pour utiliser des noms de clés sensibles à la casse dans vos données, utilisez WITH SERDEPROPERTIES ("case.insensitive"= FALSE;). Ensuite, pour chaque clé qui n'est pas encore entièrement en minuscules, fournissez un mappage entre le nom de la colonne et le nom de la propriété à l'aide de la syntaxe suivante :

ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.userid" = "userId")

Si vous avez deux clés, comme URL et Url, qui sont identiques quand elles sont écrites en minuscules, une erreur comme celle-ci peut se produire :

HIVE_CURSOR_ERROR : La ligne n'est pas un objet JSON valide - JSONException : clé dupliquée « url »

Pour résoudre ce problème, définissez la propriété case.insensitive sur FALSE et mapper les clés avec différents noms, comme dans l'exemple suivant :

ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.url1" = "URL", "mapping.url2" = "Url")
mappage

Facultatif. Cette propriété mappe les noms de colonnes aux clés JSON qui ne sont pas identiques aux noms de colonne. Le paramètre mapping est utile lorsque les données JSON contiennent des clés qui sont des mots-clés. Par exemple, si vous avez une clé JSON nommée timestamp, utilisez la syntaxe suivante pour mapper la clé à une colonne nommée ts:

ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("mapping.ts" = "timestamp")
Mapper les noms de champs imbriqués avec des deux-points à des noms compatibles avec Hive

Si vous avez un nom de champ avec des deux-points à l’intérieur d’un struct, vous pouvez utiliser la propriété mapping pour associer le champ à un nom compatible avec Hive. Par exemple, si vos définitions de type de colonne contiennent my:struct:field:string, vous pouvez mapper la définition à my_struct_field:string en incluant l’entrée suivante dans WITH SERDEPROPERTIES :

("mapping.my_struct_field" = "my:struct:field")

L’exemple suivant montre l’instruction CREATE TABLE correspondante.

CREATE EXTERNAL TABLE colon_nested_field ( item struct<my_struct_field:string>) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("mapping.my_struct_field" = "my:struct:field")

Exemple : données publicitaires

L'exemple d'instruction DDL suivant utilise le code SerDe JSON OpenX pour créer un tableau basé sur les mêmes exemples de données publicitaires en ligne que ceux utilisés dans l'exemple du fichier JSON Hive. SerDe Dans la LOCATION clause, remplacez-le myregion par l'identifiant de la région dans laquelle vous exécutez Athena.

CREATE EXTERNAL TABLE impressions ( requestbegintime string, adid string, impressionId string, referrer string, useragent string, usercookie string, ip string, number string, processid string, browsercokie string, requestendtime string, timers struct< modellookup:string, requesttime:string>, threadid string, hostname string, sessionid string ) PARTITIONED BY (dt string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://amzn-s3-demo-bucket.elasticmapreduce/samples/hive-ads/tables/impressions';

Exemple : désérialisation des données JSON imbriquées

Vous pouvez utiliser le JSON SerDes pour analyser des données plus complexes codées en JSON. Cela implique l'utilisation d'instructions CREATE TABLE utilisant des éléments struct et array pour représenter des structures imbriquées.

L'exemple suivant crée une table Athena à partir de données JSON ayant des structures imbriquées. La structure de l'exemple est la suivante :

{ "DocId": "AWS", "User": { "Id": 1234, "Username": "carlos_salazar", "Name": "Carlos", "ShippingAddress": { "Address1": "123 Main St.", "Address2": null, "City": "Anytown", "State": "CA" }, "Orders": [ { "ItemId": 6789, "OrderDate": "11/11/2022" }, { "ItemId": 4352, "OrderDate": "12/12/2022" } ] } }

N'oubliez pas qu'OpenX SerDe s'attend à ce que chaque enregistrement JSON se trouve sur une seule ligne de texte. Lorsqu'elles sont stockées dans Amazon S3, toutes les données de l'exemple précédent doivent se trouver sur une seule ligne, comme ceci :

{"DocId":"AWS","User":{"Id":1234,"Username":"carlos_salazar","Name":"Carlos","ShippingAddress" ...

L'CREATE TABLEinstruction suivante utilise le Openx- JsonSerDe avec les types de données de array collecte struct et pour établir des groupes d'objets pour les données d'exemple.

CREATE external TABLE complex_json ( docid string, `user` struct< id:INT, username:string, name:string, shippingaddress:struct< address1:string, address2:string, city:string, state:string >, orders:array< struct< itemid:INT, orderdate:string > > > ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://amzn-s3-demo-bucket/myjsondata/';

Pour interroger la table, utilisez une SELECT instruction comme celle-ci.

SELECT user.name as Name, user.shippingaddress.address1 as Address, user.shippingaddress.city as City, o.itemid as Item_ID, o.orderdate as Order_date FROM complex_json, UNNEST(user.orders) as temp_table (o)

Pour accéder aux champs de données à l'intérieur des structures, l'exemple de requête utilise la notation par points (par exemple,user.name). Pour accéder aux données d'un tableau de structures (comme pour le orders champ), vous pouvez utiliser la UNNEST fonction. La UNNEST fonction aplatit le tableau pour en faire une table temporaire (appelée o dans ce cas). Cela vous permet d'utiliser la notation par points comme vous le feriez avec les structures pour accéder aux éléments de tableau non imbriqués (par exemple,). o.itemid Le nomtemp_table, utilisé dans l'exemple à des fins d'illustration, est souvent abrégé en. t

Le tableau suivant présente les résultats de la requête.

# Nom Address Ville Identifiant de l'article Date_commande
1 Carlos 123 rue Main Anytown 6789 11/11/2022
2 Carlos 123 rue Main Anytown 4352 12/12/2022

Rubrique suivante :

SerDe bibliothèques CSV

Rubrique précédente :

Hive JSON SerDe
ConfidentialitéConditions d'utilisation du sitePréférences de cookies
© 2025, Amazon Web Services, Inc. ou ses affiliés. Tous droits réservés.