Utiliser le type de schéma map
Un schéma map est un tableau d'entrées contenant une clé et une valeur.
Créer une map
Vous pouvez créer une map à partir de données existantes, à l'aide d'une clause SELECT ENTRY. Cela vous permet de définir un identifiant ou une expression à utiliser en tant que clé et de définir un identifiant, une expression ou une sous-requête à utiliser en tant que valeur. La clause doit être structurée comme ceci :
SELECT ENTRY {
key = expression,
value = expression or sub-query
}
Vous pouvez implicitement attribuer un identifiant comme clé ou valeur de la map, avec la syntaxe suivante :Dans ce cas, la valeur du premier identifiant est utilisée comme clé et la valeur du second identifiant est utilisée comme valeur. Si au moins l'un des éléments de map est explicitement attribué, l'ordre n'est pas important.
SELECT ENTRY {
key identifier, value identifier
}
Par exemple, avec les données d'entrée suivantes :
{
"order":[
{
"orderno":1001,
"custid":"C41",
"order_date":"2017-04-29",
"ship_date":"2017-05-03",
"items":[
{
"itemno":347,
"qty":5,
"price":19.99
},
{
"itemno":193,
"qty":2,
"price":28.89
}
]
},
{
"orderno":1002,
"custid":"C13",
"order_date":"2017-05-01",
"ship_date":"2017-05-03",
"items":[
{
"itemno":460,
"qty":95,
"price":100.99
},
{
"itemno":680,
"qty":150,
"price":8.75
}
]
}
]
}
Vous pouvez utiliser la requête suivante pour créer une map dans laquelle la clé est l'élément orderno et la valeur est un tableau d'éléments itemno :
FROM order
SELECT ENTRY {
value = (
FROM items
SELECT itemno
),
orderno
}
Dans ce cas, le résultat suivant est retourné :
{
"1001":[
347,
193
],
"1002":[
460,
680
]
}
Vous pouvez également convertir un enregistrement en map à l'aide de la fonction toMap. Par exemple, avec la valeur d'entrée utilisée ci-dessus, vous pouvez utiliser la requête suivante pour convertir l'enregistrement order en une map, ce qui vous permet d'appeler des éléments de map à l'aide de leur clé, en suivant la syntaxe map_identifier['key'].
FROM order AS o
LET $o = toMap(o)
SELECT {
id = concatWith('-',$o['custid'], $o['orderno']),
total = (
FROM items
SELECT sum(price)
)
}
Le résultat suivant est retourné :
[
{
"id":"C41-1001",
"total":48.88
},
{
"id":"C13-1002",
"total":109.74
}
]
Pour plus d'informations concernant la fonction toMap, consultez Fonctions spéciales.
Lire une map
Lorsque vos données contiennent une map, vous pouvez sélectionner ses clés et valeurs dans votre requête. Par exemple, avec une entrée nommée properties contenant les données suivantes :Vous pouvez lire le contenu JSON en tant que map à l'aide du schéma Avro suivant :
{
"author":"Margaret Atwood",
"title":"The Handmaid's Tale",
"isbn":"978-0099740919"
}
{
"type":"map",
"name":"properties",
"values":"string"
}
Vous pouvez ensuite utiliser cette requête pour retourner un tableau d'enregistrements ayant un élément contenant la clé et un autre contenant la valeur :
FROM properties.entry
SELECT {key, value}
Cette requête retourne le résultat suivant :
[
{
"key":"author",
"value":"Margaret Atwood"
},
{
"key":"title",
"value":"The Handmaid's Tale"
},
{
"key":"isbn",
"value":"978-0099740919"
}
]