Skip to content

M1 DevOps project : Dataframe java library with a CI/CD pipeline (Github-Travis CI-DockerHub)

Notifications You must be signed in to change notification settings

chouaibMo/DevOps-dataframe-project

Repository files navigation

DevOps Project : Dataframe

Build Status Codacy Badge codecov

Préambule

Les Dataframes sont des tableaux en deux dimensions où chaque colonne est identifiée par un label et chaque ligne par un index. Chaque colonne stocke des données d’un seul type. Cependant deux colonnes différentes peuvent stocker des types différents.
Pandas est une des bibliotèques les plus populaires (pour langage Python). Elle permet de traiter de grandes quantités de données simplement et efficacement (plus d'informations sur https://pandas.pydata.org).
L’objectif de ce projet est d'implémenter une sous-partie des fonctionnalitées offertes par Pandas en Java.

Documentation : Javadoc

La documentation java de cette bibliothèque peut etre génerée en executant la commande suivante à la racine du projet :

mvn javadoc:javadoc

Vous trouverez la documentation génerée par cette commande dans le repertoire target/site/apidocs.

Description des fonctionnalitées

Toutes les fonctionnalitées présentées dans cette section ont été inspirée de la bibliothèque Pandas.

1- Création d'un Dataframe

Cette bibliotèque permet d'instancier un Dataframe de 3 manières différentes :

  • Création d'un Dataframe vide qui pourra etre rempli par la suite en y ajoutant des colonnes.

  • Création d'un Dataframe à partie d'une structure de données (HashMap). Chaque entrée de cette structure est représentée par une clé (nom de colonne), et une valeur (liste des valeur de la colonne).
    Attention : Toutes les colonnes doivent etre de la meme tailles, c'est a dire contenir le meme nombre d'elements.

  • Création d'un dataframe à partir d'un fichier csv. Le fichier csv doit contenir en première ligne le type de chaque colonne. Quelques fichiers csv sont disponibles dans le répertoire src/main/ressources/.
    Attention : Toutes les colonnes doivent etre de la meme tailles, c'est a dire contenir le meme nombre d'elements.

2- Ajout/Suppression de données dans un Dataframe

La bibliothèque fournis différentes techniques pour modifier le contenu d'un Dataframe :

  • Suppression d'une colonne suivant son index : dropColumn(int)
  • Suppression d'une colonne suivant son label : dropColumn(String)
  • Suppression de la dernière colonne du Dataframe : pop()
  • Insertion d'un colonne : insertColumn(Column)
  • Insertion d'une ligne : insertRow(String[])

3- Affichage d'un Dataframe

Il existe 4 manières différentes pour afficher le contenu d'un Dataframe :

  • Afficher le contenu intégral : fetchAll
  • Afficher le contenu d'un interval: fetchFromTo(int,int)
  • Afficher les n premières lignes : head(int)
  • Afficher les n dernières lignes : tail(int)

4- Sélections dans un Dataframe

Il existe 2 manières différentes pour réaliser une selection dans un Dataframe. Le résultat de la sélection est un nouveau Dataframe :

  • Selection d'un sous ensemble de lignes : selectionRow(int,int)
  • Selection d'un sous ensemble de colonnes: selectionColumn(List<String>)

5- Fonctions statistiques sur un Dataframe

Il existe 4 fonctions statistiques, applicables sur les colonnes numériques d'un Dataframe (Integer, Double ou Float). Ces fonctions prennent en parametre le nom (label) d'une colonne :

  • Le minimum : min(String)
  • Le maximum : max(String)
  • La somme : sum(String)
  • La moyenne : mean(String)

La fonction printStats permet d'afficher le resultat de ces fonctions sous forme d'un tableau.

Description des outils utilisés

  • Maven 4.0.0: Comme outils d'automatisation de developpement
  • JUnit 4.13 : Pour les tests unitaires
  • GitHub : Comme service de dépot git pour ce projet
  • Travis CI : Pour l'integration continue
  • JaCoCo : Pour évaluer la couverture du code
  • CodeCov : Permet d'avoir un badge sur GitHub avec le pourcentage de couverture
  • Codacy : Pour évaluer la qualité du code
  • DockerHub : Comme service de dépot pour notre image Docker

De plus, 2 dépendances maven sont utilisées :

On utilise également le plugin maven maven-shade-plugin pour génerer un jar executable pour lancer le main de démontration (pour plus d'infos http://maven.apache.org/plugins/maven-shade-plugin/)

Docker - DockerHub

Une pipeline de livraison continue est mise en place grace a l'outils Travis CI. Cela consiste à mettre a jour une image Docker sur le DockerHub, automatiquement à chaque commit sur GitHub. La seule contrainte qui existe, est que tout les tests unitaires passent avec succès.
L'execution de l'image docker déroule une serie de scénarios de démonstrations d'un ensemble de fonctionnalitées que la bibliotèque propose.
Pour visiter le dépot dockerHub associé a ce projet : chouaibmo.

Pour récuperer l'image docker :

$ docker pull chouaibmo/dataframe:latest

Pour démarrer un conteneur correspondant à cette image docker :

$ docker run -it --rm chouaibmo/dataframe

Execution

Pour lancer les tests unitaire, executer la commande suivante à la racine du projet :

$ mvn test

Pour lancer les tests unitaire et génerer le jar, executer la commande suivante à la racine du projet :

$ mvn package

Pour lancer le main de demonstration, assurez-vous que le fichier oscars.csv est dans le répertoire src/main/ressources/, executer ensuite une des commandes suivantes à la racine du projet :

$ mvn exec:java -Dexec.args="src/main/ressources/oscars.csv"
$ java -jar target/DataframeDemo.jar src/main/ressources/oscars.csv

Pour génerer la javadoc, executer la commande suivante à la racine du projet :

$ mvn javadoc:javadoc

FeedBack

Ce project a été une occasion de mettre en oeuvre toutes les connaissances acquises durant ce semestres, et de se familiariser encore plus avec les outils étudiés dans un contexte plus technique que les TPs. C'était aussi l'occasion de découvrir d'autres outils (codacy, codecov ...) ainsi que de dependances et plugins maven (tel que maven-shade qui permet de générer un ou plusieurs jar executables automatiquement).
La mise en place des tests et de la pipeline d'intégration, dans les premières phases du projets, permet d'avancer très rapidement, et d'avoir une version stable et fonctionnelle après chaque fonctionnalité implémentée.

REMARQUE : le badge codecov sur le depot du projet n'affiche que 88% en couverture de code car l'outils n'ignore pas la classe main. Cela dit, JaCoCo évalue bel et bien la couverture à 100%.

About

M1 DevOps project : Dataframe java library with a CI/CD pipeline (Github-Travis CI-DockerHub)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published