OSBI.FR - Open Source Business Intelligence

Les boucles dans PDI (Kettle)

Introduction :

Bien souvent, quand on développe des traitements d’intégration de données avec Pentaho Data Integration, on est amené à rejouer plusieurs fois le même job sur des objets de structure identique (SGBD, fichiers, serveurs web…) , et pour lesquels au final seulement quelques paramètres sont à modifier.

Plutôt que de modifier à chaque fois le job Kettle puis relancer le traitement sur l’objet à traiter, ne serait-il pas plus judicieux de mettre en place une structure itérative (une boucle donc) afin de gérer les différents paramètres de façon dynamique ?

Quelques exemples que j’ai pu rencontrer lors de projets divers (et variés) :

  • Chargement (ou lecture) de plusieurs SGBD avec des schémas de base identique. Par exemple une application web reposant sur une base PostgreSQL déployée chez une cinquantaine de clients différents. Dans ce cas, les paramètres qui varient sont l’adresse ip, le nom d’utilisateur et le mot de passe d’accès à la base Postgres, le nom de la base de données, éventuellement le schéma
  • Lecture de 2500 bases Microsoft Access de structure identique, via un driver ODBC, pour consolider le contenu dans un entrepôt de données Oracle. Un seul paramètre variable: le nom de la base Access qui suffit pour l’identification
  • Récupération et traitement d’une multitude de fichiers plats, de tous types: Excel, CSV, XML ou autres…

Bien sûr cette liste est loin d’être exhaustive, la diversité des itérations possibles dépend des traitements auxquels vous êtes confrontés !

Le concept des boucles dans Kettle :

Par conception, Kettle ne gère pas nativement de structures itératives: essayez donc de trouver une brique de type « For – Next » ou « Do – Loop Until/While » dans Spoon !

Tout cela est du principalement au fonctionnement interne de Kettle, dont un des mécanismes fondamentaux est la capacité à gérer du parallélisme sur les différents flux de données à traiter.

Un exemple pratique :

Afin d’illustrer mon propos, je vous propose un petit exemple concret afin de comprendre la méthodologie de mise en place et notamment l’utilisation des variables d’environnement dans Kettle.

J’avais déjà d’ailleurs plus ou moins abordé le sujet dans un précédent article, qui détaillait comment récupérer des fichiers CSV mis à disposition par l’UNEDIC et ceci via une récupération HTTP POST.

Nous travaillerons donc sur ce type de fichiers :

Chacun de ces fichiers contient des informations statistiques pour une région et une année précise, et ceci pour chacune des catégories professionnelles de la nomenclature NAF 88 .

On retrouve ainsi dans chaque fichier le nombre d’établissements et le nb de salariés de chaque catégorie d’activité professionnelle (hommes, femmes, total).

Aperçu du contenu du fichier pour l’Alsace (2006) :

Comme on peut le constater, les informations sur la région et l’année ne sont pas stockées dans le fichier (pour éviter les redondances sur chaque ligne), mais seulement dans l’intitulé du fichier.

Objectif du traitement Kettle à mettre en place :

On dispose d’une quarantaine de fichiers en entrée: pour toutes les régions de France, sur 2006 et 2007 .

Ceux-ci doivent être traités les uns après les autres afin d’être intégrés dans une table d’une base de données (par exemple).

Pour simplifier l’installation du job sur votre PC, je me contenterai de stocker le tout dans un seul et même fichier plat !

Méthodologie :

Etape 1: Pour faire des boucles dans Kettle, vous devez tout d’abord créer une transformation qui va générer autant de lignes que d’itérations à réaliser.

Chacune de ces lignes doit comporter les données utiles au paramétrage de l’exécution du traitement pour une itération précise.

La transformation « s’achève » par une étape de type « Copie lignes vers le résultat »

Dans notre cas, la transformation « Génération Tuples » s’appuie sur un fichier Excel qui contient l’ensemble des paramètres sur lesquels on va boucler (année et région).

Bien sûr, on pourrait stocker les tuples dans un fichier XML, ou encore mieux, effectuer une récupération dynamique en parcourant le répertoire source, en parsant le nom des fichiers afin de récupérer pour chacun d’entre eux la région et l’année.

Bref, soyez malins 😉

Etape 2: On crée un job (« Job Principal » dans mon cas) qui démarre avec la transformation précédemment créée et qui se poursuit avec le sous-job « Job Itératif »: la mise en place de la boucle s’effectue en cochant la case « Exécuter pour chaque ligne récupérée » sur le paramétrage d’exécution du sous-job.

En somme, à chaque ligne retournée par « Génération Tuples », le job itératif sera lancé !

Etape 3: Afin de pouvoir réutiliser les différentes variables propres à chaque itération (année et région), on doit affecter à chacune d’entre elle une « variable d’environnement ».

ATTENTION, ces variables d’environnement ne pouvant pas être affectées et utilisées dans la même transformation, il faut impérativement créer 2 transformations distinctes dans le « job itératif » :

La transformation « Affectation Variables » ressemble à ceci :

La transformation « Chargement Fichier » permet de stocker dans un même fichier plat la totalité des données, avec pour chaque ligne les informations « année » et « région », désormais indispensables pour pouvoir s’y retrouver !

Le paramétrage d’accès à chaque fichier d’entrée doit être dynamique, donc en utilisant les variables ${VAR_REGION} et ${VAR_ANNEE} :

En ce qui concerne le rajout des variables années et région dans le flux de données, il faut passer par une étape de type « Récupération Variables » qui va permettre de rajouter celles-ci au niveau de chacune des lignes traitées, en tant que nouvelles colonnes du flux de données.

Dans le fichier de sortie, ne pas oublier de cocher la case « Ajouter au contenu » afin de bien concaténer les données de chaque itération REGION/ANNEE les unes à la suite des autres 🙂

Sources :

Cet exemple est téléchargeable ici :

  • Dézipper le fichier « boucles-kettle.zip » dans votre répertoire d’installation de Kettle
  • Lancer Kettle et exécuter le job « Job Principal.kjb ». Un fichier « temp_file.txt » sera complété à chaque itération jusqu’à la fin de l’exécution du traitement.
  • Adapter le job à vos propres besoins !

Nota: Cet exemple est issu de la formation Easy Quick Start Kettle proposée régulièrement ou sur simple demande par Atol CD : http://www.atolcd.com/btn-serv/formation/kettle-pentaho-data-integration.html

Bonnes boucles ! 😉

Sylvain

5 Comments

  1. Tres tres bon ca Sylvain !!
    Je pense que tu viens, au travers de cet article, d’eclairer pas mal de monde si l’on considere le nombre de questions sur les boucles dans les forums Kettle.
    En tout cas pour ma part, c’est dans ma knowledge base maintenant.

  2. Bonjour Sylvain et vraiment merci pour votre temps que vous consacrez. J’ai un souci de boucle sur la version 4.0 pourtant avec la version 3.2 ça marche nickel .N’existe t’il pas une configuration spéciale à faire pour le 4.0

  3. Bonjour ,
    je suis débutante en BI en genéral

    j’ai une base de données,j’ai créé une nouvelle pour qu elle soit mon datawarehouse et j ai copié les données avec PDI
    avec extraction depuis table vers table
    je veux en même temps que quand il y a de nouvelles données ces dernières passent automatiquement a mon datawarehouse
    je fais comment???

Les commentaires sont fermés.