Introduction
« Injection de métadonnées et dénormalisation dynamique avec PDI », voilà un titre d’article pompeux et compliqué !
Derrière ce concept se cache une fonctionnalité vraiment intéressante de Pentaho Data Integration qui permet de répondre à un besoin assez fréquent : comment paramétrer dynamiquement des structures de données (qu’on désigne également par le terme « métadonnées »), sans avoir à retoucher manuellement les transformations utilisant celles-ci ?
Pour bien comprendre le concept, prenons un exemple tout bête: la génération d’un tableau croisé sous Excel représentant la synthèse des ventes d’un panel de clients, et ceci pour chaque année.
1. La Dénormalisation statique
Comme habituellement, j’utiliserai la base SampleData comme source de données.
(Lien de téléchargement : . Se référer à l’article « OSBI et Tableaux Croisés » pour son installation)
La transformation Kettle qui permet de générer le tableau croisé sous Excel ressemble à ceci :
L’étape « Extraction depuis table » permet de récupérer la synthèse des ventes depuis la base de données, dans un format normalisé, soit 1 ligne par client et par année (s’il n’y a pas de ventes pour un client et/ou une année donnée, aucune ligne n’est renvoyée ) :
L’étape « Dénormalisation ligne » permet de créer autant de nouvelles colonnes « années » que nécessaire.
Pour cela il suffit de paramétrer les infos suivantes :
- « Champ Clé » : la colonne du flux d’entrée sur laquelle on veut faire pivoter les données => l’année
- « Champs de groupement »: la ou les colonne(s) (flux d’entrée) sur lesquelles doivent être groupées les données (attention il faut trier les données selon les champs de groupement) => le client
- « Nom champ cible » : les nouvelles colonnes devant être rajoutées au flux de sortie => année 2003, année 2004, année 2005
- « Valeur champ cible » : les colonnes du flux d’entrée depuis lesquelles va être recopiée la valeur dans les champs cibles. En général c’est souvent le même champ, ici => le montant
- « Valeur clé »: la valeur de la clef pour laquelle sera renseigné le champ cible. Par exemple si clef=2013, le champ année 2013 sera renseigné (et seulement celui-ci !)
- « Type » : le type de donnée du champ cible (un nombre)
Dans notre exemple la configuration de l’étape est donc la suivante :
On obtient alors en sortie le tableau croisé ci-dessous :
On constate que maintenant il n’y a plus qu’une seule ligne par client, et que le montant des ventes a été répercuté dans les colonnes Années 2003, Année 2004 et Année 2005 (certaines cellules sont vides car il n’y a pas eu de ventes).
L’étape « Dénormalisation lignes » fonctionne donc plutôt bien, mais elle présente un gros inconvénient: si jamais de nouvelles années apparaissent dans le flux entrant, il faut éditer l’étape et rajouter manuellement les nouvelles colonnes de sortie dans le tableau « Champs cibles ». Le problème est bien sûr qu’on ne sait jamais vraiment quand va apparaître une nouvelle ligne qui va nécessiter une mise à jour manuelle de la transformation…
C’est dans ce contexte que le mécanisme « d’injection de métadonnées » est vraiment intéressant 🙂
L’injection de métadonnées
L’injection de métadonnées est un concept apparu dans la version 4.2 de Kettle.
Le but est tout simple : permettre que certaines étapes de Kettle puissent être paramétrées de manière automatique afin de suivre l’évolution des structures de données traitées.
Ainsi a été créée l’étape « Injection de métadonnées », qui permet de configurer dynamiquement plusieurs étapes « sensibles » :
- Extractions de fichiers (CSV, Excel, MS Access, TXT)
- Agrégation valeurs
- Altération structure flux
- Normalisation & Dénormalisation lignes
- Décomposition champs
- Tri lignes
2. La Dénormalisation dynamique
Imaginons que dans notre exemple, on souhaite cette fois obtenir un fichier Excel de synthèse avec des données mensuelles (et non plus annuelles).
Les données d’entrée ressemblent alors à ceci :
Dans le cadre d’une dénormalisation statique (exemple précédent), il faudrait renseigner 36 champs dans le tableau de définition des champs cibles (soit 3 années x 12 mois), un peu comme ceci :
Fastidieux…
…et si on utilisait plutôt l’étape « Injection de métadonnées » ?
Dans ce cas, il faut simplement créer une transformation permettant de construire un flux de données (en mauve ci-dessous) identique à celui qui aurait été saisi manuellement dans le tableau « champs cibles » (cliquer pour agrandir l’image) :
Reste à « injecter » tout ça dans la transformation chargée de la dénormalisation, avec l’étape « Injection de métadonnées » :
Attention pour pouvoir configurer correctement les champs cibles il faut :
1. Pointer sur la transformation avec le bouton « Parcourir »
2. Cliquer sur « OK » pour fermer la fenêtre de configuration de l’étape
3. Ré-ouvrir la fenêtre de configuration, les étapes cibles pour l’injection apparaissent alors dans le tableau de paramétrage !
Une prévisualisation sur l’étape Excel permet de vérifier le bon fonctionnement :
Avec cette méthode, dès que des nouveaux mois apparaissent dans le flux, ceux-ci sont automatiquement injectés dans l’étape de dénormalisation et le fichier Excel est mis à jour en conséquence…
Tout ça sans avoir à modifier le traitement !
Conclusion
L’injection de métadonnées est une fonctionnalité très puissante de Kettle, pouvant être utilisée dans de nombreux contextes.
Un autre exemple est l’exploitation d’informations stockées dans des « méta-modèles » (c’est à dire un système de gestion d’attributs dynamiques)
Voir l’article de Matt Casters sur ce sujet : Dynamic de-normalization of attributes stored in key-value pair tables
Note: il subsiste encore quelques bugs liés à l’injection de métadonnées, en cas de pb faites donc un tour sur le JIRA de Pentaho.
Juste un exemple : l’impossibilité d’utiliser des variables d’environnement (http://jira.pentaho.com/browse/PDI-8873)
Bonjour,
Cet article sur la dénormalisaton dynamique via l’injection des métadonnées est très intéressant et nous a permis d’avancer dans notre compréhension de PDI.
Toutefois, nous nous heurtons à une autre difficulté dans nos transformations.
Le fichier Excel de sortie que l’on a généré se présente comme suit :
+——+——+——+
| 6A + 5A + 4A |
+——+——+——+
| Ele1 + + |
| Ele2 + + |
| + Ele3 + |
| + Ele4 + |
| + Ele5 + |
| + + Ele6 |
+——+——+——+
Or, nous voudrions obtenir le résultat suivant
+——+——+——+
| 6A + 5A + 4A |
+——+——+——+
| Ele1 + Ele3 + Ele6 |
| Ele2 + Ele4 + |
| + Ele5 + |
+——+——+——+
mais quel composant supplémentaire rajouter à la transformation ?
Merci déjà pour le partage de vos expériences et de l’aide que vous pourrez-nous apporter sur cette problématique.
Si besoin, nous pouvons vous envoyer par courriel nos 2 transformations et le fichier résultat actuel.
Cordialement.
Bonjour
Avec Kettle, on peut faire quasiment tout ce qu’on veut, pour peut qu’on sache précisément ce qu’il faut faire, notamment en terme de règles de gestion sur les données 🙂
Si vous avez besoin d’assistance sur le sujet, je vous suggère de contacter un commercial chez Atol C&D via cette adresse mail : contact@atolcd.com
A bientôt !
Bonjour
Merci pour ce mini tuto.
Cependant en appliquant l’exemple sur ce que je doit faire, un problème apparaît lors de l’alimentation du dernier fichier Excel.
ERROR ….. Unable to close openFile File://……
Mes recherche sur ce problème indiquaient qu’il faut spécifier l’encodage dans le kitchen.bat, mais ça ne resoud toujours pas mon problème.
Any Help please?
Merci pour votre retour
Bonjour
Tout est dans le texte « unable to close open file » => ne pas laisser un fichier Excel ouvert quand Kettle travaille dessus
Bonjour
Merci pour cette réponse.
Sauf que je me suis bien assuré que le fichier n’est jamais ouvert.
J’ai essayé même de donner un nouveau nom au fichier avec un nouvel emplacement pour qu’il le crée.
D’ailleurs j’ai trouvé une solution (et c’est la seule que j’ai trouvé) qui ne résoud pas mon prblème
http://jira.pentaho.com/browse/PDI-4265
Merci pour votre retour
Le ticket JIRA que vous indiquez est résolu depuis longtemps, en plus c’est sur une ancienne version de PDI, je vous conseille vivement de travailler avec une 5.x
Voici ma trace d’erreur complète
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – ERROR (version 5.0.1-stable, build 1 from 2013-11-15_16-08-58 by buildguy) : Unable to close openFile file : file:///C:/chemin/pentaho-4.8.0-biserver-ce-stable/data-integration/fichier_denorm.xls
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – ERROR (version 5.0.1-stable, build 1 from 2013-11-15_16-08-58 by buildguy) : java.lang.ArrayIndexOutOfBoundsException: 441
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – at jxl.biff.IndexMapping.getNewIndex(IndexMapping.java:68)
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – at jxl.biff.FormattingRecords.rationalize(FormattingRecords.java:385)
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – at jxl.write.biff.WritableWorkbookImpl.rationalize(WritableWorkbookImpl.java:1023)
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – at jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:701)
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – at org.pentaho.di.trans.steps.exceloutput.ExcelOutput.closeFile(ExcelOutput.java:664)
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – at org.pentaho.di.trans.steps.exceloutput.ExcelOutput.dispose(ExcelOutput.java:776)
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – at org.pentaho.di.trans.step.RunThread.run(RunThread.java:100)
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – at java.lang.Thread.run(Thread.java:745)
2015/05/11 09:38:28 – Alimentation fichier MS Excel.0 – Fin exécution étape (Entrées=0, Sorties=65, Lues=65, Ecrites=65, Maj=0, Erreurs=1)
2015/05/11 09:38:28 – InjectionMetadonnees – ERROR (version 5.0.1-stable, build 1 from 2013-11-15_16-08-58 by buildguy) : Erreurs détectées!
2015/05/11 09:38:28 – Pentaho Data Integration – L’exécution de la transformation a été achevée!
2015/05/11 09:38:28 – InjectionMetadonnees – ERROR (version 5.0.1-stable, build 1 from 2013-11-15_16-08-58 by buildguy) : Erreurs détectées!
2015/05/11 09:38:28 – InjectionMetadonnees – ERROR (version 5.0.1-stable, build 1 from 2013-11-15_16-08-58 by buildguy) : Erreurs détectées!
2015/05/11 09:38:28 – InjectionMetadonnees – InjectionMetadonnees
2015/05/11 09:38:28 – InjectionMetadonnees – InjectionMetadonnees
Merci pour votre retour
Ma version de PDI est bien la : Pentaho Data Integration – Spoon version Version stable – 5.0.1-stable
Merci à vous
la version 5.0.1 de PDI n’est pas très stable, préférez-lui plutôt une 5.2 :
http://sourceforge.net/projects/pentaho/files/Data%20Integration/5.2/pdi-ce-5.2.0.0-209.zip/download
bon courage 🙂
Merci à vous pour ce retour.
Re:
Malheureusement l’erreur persiste même en ayant téléchargé, installé et utilisé la version pdi-ce-5.2.0 stable.
Impossible d’ouvrir mon fichier final!!
🙁
Malheureusement il est impossible de vous aider comme cela…
PS: vous pouvez demander de l’assistance (payante) à cette adresse contact@atolcd.com
Bonjour,
Merci pour l’exemple. Je suis en version de pdi 6.1.0.
Le traitement se fait correctement, seulement à la sortie du composant metadata injector.
Comment faire, si on ne veut pas spécifier dans l’alimenation du fichier excel les colonnes à exporter ?
Bonjour. Il suffit de ne pas spécifier les champs pour l’alimentation du fichier Excel.
ca fonctionne !
Je ne l’avais pas testé ….
Ca fonctionne avec toutes les briques de type alimentation 🙂