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.
OpenX JSON SerDe
Comme le Hive JSON SerDe, vous pouvez utiliser JSON OpenX pour JSON traiter les données. Les données sont également représentées sous forme de chaînes de texte JSON codé d'une seule ligne séparées par une nouvelle ligne. Comme le Hive JSON SerDe, JSON SerDe OpenX n'autorise pas la duplication de clés struct
ou de noms map
de clés.
Considérations et restrictions
-
Lors de l'utilisation d'OpenX JSON 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 Ruche JSON SerDe ou réécrivez les données dans un autre format de fichier.
-
Le SerDe s'attend à ce que chaque JSON document se trouve sur une seule ligne de texte, aucun caractère de fin de ligne ne séparant les champs de l'enregistrement. Si le JSON texte est dans un joli format d'impression, vous pouvez recevoir un message d'erreur tel que
HIVECURSOR_ _ ERROR : La ligne n'est pas un JSON objet valide
ouHIVECURSOR_ _ ERROR JsonParseException end-of-input : Inattendu : marqueur de fermeture attendu OBJECT
lorsque vous essayez d'interroger la table après l'avoir créée.Pour plus d'informations, consultez la section Fichiers de JSON données
dans la SerDe documentation OpenX sur. GitHub
Propriétés facultatives
Contrairement au Hive JSON SerDe, l'JSON SerDe OpenX 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 cette valeur est définie sur
TRUE
, elle vous permet d'ignorer une JSON syntaxe malformée. L’argument par défaut estFALSE
. - 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 l'JSONensemble de données contient une clé portant le nom"a.b"
, vous pouvez utiliser cette propriété pour définir le nom de colonne qui doit figurer"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
etUrl
, 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 JSON objet valide - JSONException : clé dupliquée « url »
Pour résoudre ce problème, définissez la propriété
case.insensitive
surFALSE
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. Associe les noms de colonnes à JSON des clés qui ne sont pas identiques aux noms de colonnes. Le
mapping
paramètre est utile lorsque les JSON données contiennent des clés qui sont des mots clés. Par exemple, si une JSON clé est nomméetimestamp
, utilisez la syntaxe suivante pour mapper la clé à une colonne nomméets
: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 contiennentmy:struct:field:string
, vous pouvez mapper la définition àmy_struct_field:string
en incluant l’entrée suivante dansWITH 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'DDLinstruction suivant utilise OpenX JSON SerDe pour créer un tableau basé sur les mêmes exemples de données publicitaires en ligne que ceux utilisés dans l'exemple de The Hive. JSON SerDe Dans la LOCATION
clause, remplacez myregion
avec 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 d'imbriqué JSON
Vous pouvez utiliser le JSON SerDes pour analyser des données JSON codées plus complexes. 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 JSON données comportant des structures imbriquées. L'exemple présente la structure 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 que l'OpenX SerDe s'attend à ce que chaque JSON enregistrement 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 TABLE
instruction suivante utilise le Openx- JsonSerDearray
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 |