Accéder au contenu principal Passer au contenu complémentaire

Regrouper les éléments

Availability-noteBêta
Créez une hiérarchie à partir d'un fichier plat, à l'aide des clauses Data Shaping Query Language GROUP BY et GROUP AS.

Avant de commencer

  • Vous avez créé des structures d'entrée et de sortie. Vous pouvez utiliser les échantillons JSON ci-dessous pour créer vos structures.

Pourquoi et quand exécuter cette tâche

Dans cet exemple, vous allez créer une map DSQL pour extraire des données relatives à un magasin, à partir d'un fichier plat JSON et écrire ces données dans une structure hiérarchique.

Dans le fichier JSON échantillon ci-dessous, chaque objet du tableau items contient des données concernant un élément, notamment son magasin et son rayon. Dans la sortie, au lieu d'un enregistrement par élément, vous souhaitez d'abord avoir un enregistrement par magasin, puis un enregistrement par rayon, puis finalement un enregistrement par objet de chaque rayon.

Les données d'entrée ressemblent à ceci :
{
    "items": [
        {
            "store_name": "plusstore",
            "store_location": "saint louis",
            "department_name": "sports",
            "salesperson_id": "25",
            "item_name": "MBIKE"
        },
        {
            "store_name": "plusstore",
            "store_location": "saint louis",
            "department_name": "sports",
            "salesperson_id": "25",
            "item_name": "ESCOOT"
        },
        {
            "store_name": "plusstore",
            "store_location": "saint louis",
            "department_name": "electronics",
            "salesperson_id": "32",
            "item_name": "Portable SSD T5"
        },
        {
            "store_name": "plusstore",
            "store_location": "saint louis",
            "department_name": "electronics",
            "salesperson_id": "32",
            "item_name": "Extreme Portable SSD"
        },
        {
            "store_name": "goodstore",
            "store_location": "nashville",
            "department_name": "electronics",
            "salesperson_id": "47",
            "item_name": "Toshiba P300"
        },
        {
            "store_name": "goodstore",
            "store_location": "nashville",
            "department_name": "fresh",
            "salesperson_id": "47",
            "item_name": "Italian tomatoes"
        }
    ]
}
La structure de sortie ressemble à ceci :
{
    "stores": [
        {
            "name": "",
            "location": "",
            "departments": [
                {
                    "name": "",
                    "salesperson_id": "",
                    "items": [
                        {
                            "name": ""
                        }
                    ]
                }
            ]
        }
    ]
}

Procédure

  1. Créez une DSQL Map (Map DSQL) et ajoutez les structures d'entrée et de sortie.
    Un premier mapping entre les éléments racine est automatiquement créé. Vous pouvez voir l'expression Data Shaping Query Language correspondante dans l'élément racine de la structure de sortie.
  2. Cliquez sur l'élément de sortie stores et saisissez l'expression suivante :
    FROM items
    GROUP BY store_name
    GROUP AS gstore
    La clause GROUP BY assure que la sortie ne produit qu'une seule occurrence de stores pour chaque valeur unique de store_name. La clause GROUP AS est utilisée pour attribuer un nom au groupe courant, pouvant être utilisé pour d'autres expressions. Pour plus d'informations, consultez le Guide de référence de Talend Data Shaping Language.
  3. Glissez-déposez store_name sur l'élément de sortie name, sous stores.
  4. Cliquez sur l'élément de sortie location et saisissez l'expression suivante :
    gstore[0].store_location

    Vous ne pouvez pas simplement utiliser store_location comme expression dans ce cas, car il peut y avoir plusieurs valeurs store_location dans le même groupe. Puisque le regroupement se fait sur store_name, c'est le seul élément dont l'unicité de la valeur est garantie dans chaque groupe.

    L'expression ci-dessus indique que la valeur de sortie doit être la valeur de l'élément store_location du premier élément du groupe courant.

  5. Cliquez sur l'élément de sortie departments et saisissez l'expression suivante :
    FROM gstore
    GROUP BY department_name
    GROUP AS gdepartment

    C'est le même processus que pour l'élément stores, cette fois pour produire une occurrence du tableau departments pour chaque valeur unique de department_name.

  6. Glissez-déposez department_name sur l'élément de sortie name sous departments, puis cliquez sur l'élément de sortie saledperson_id et saisissez l'expression suivante :
    gdepartment[0].salesperson_id
  7. Cliquez sur l'élément de sortie items et saisissez FROM gdepartment, puis glissez-déposez item_name sur l'élément name sous items.

Résultats

Votre map est configurée. Vous pouvez utiliser la fonction Test Run (Exécution de test) pour consulter les résultats. Dans cet exemple, le résultat suivant est retourné :
{
   "stores":[
      {
         "name":"plusstore",
         "location":"saint louis",
         "departments":[
            {
               "name":"electronics",
               "salesperson_id":"32",
               "items":[
                  {
                     "name":"Portable SSD T5"
                  },
                  {
                     "name":"Extreme Portable SSD"
                  }
               ]
            },
            {
               "name":"sports",
               "salesperson_id":"25",
               "items":[
                  {
                     "name":"MBIKE"
                  },
                  {
                     "name":"ESCOOT"
                  }
               ]
            }
         ]
      },
      {
         "name":"goodstore",
         "location":"nashville",
         "departments":[
            {
               "name":"electronics",
               "salesperson_id":"47",
               "items":[
                  {
                     "name":"Toshiba P300"
                  }
               ]
            },
            {
               "name":"fresh",
               "salesperson_id":"47",
               "items":[
                  {
                     "name":"Italian tomatoes"
                  }
               ]
            }
         ]
      }
   ]
}

Cette page vous a-t-elle aidé ?

Si vous rencontrez des problèmes sur cette page ou dans son contenu – une faute de frappe, une étape manquante ou une erreur technique – dites-nous comment nous améliorer !