La BI en temps réel avec Azure et Power BI

Dans cet article, nous allons découvrir comment créer des rapports Power BI pour analyser des données en temps réel. Pour cela, nous aurons besoin d’Azure qui assurera la partie récupération des données (via un Event Hub) et leur transmission à Power BI (via un Steaming Analytics Job).

Scénario

Prenons, comme exemple, les données en temps réel des vélibs disponibles ici sous format JSON afin de produire un rapport illustrant le nombre de vélibs disponibles ainsi que le nombre de stands disponibles pour une station.

Moyens requis

Pour faire ce tutoriel, vous devez disposer d’un compte Microsoft Azure. Vous avez la possibilité de créer un compte gratuit, une version d’essai gratuite sera à votre disposition pendant un mois.
Vous devez aussi disposer d’un compte Power BI. Vous pouvez le créer gratuitement à partir d’ici.

Architecture

architecture2

Création d’un Event Hub

Pour la création d’un hub d’évènement, il suffit de se connecter au Gestionnaire Azure et cliquer sur Nouveau App Services  Service bus  Hub d’évènements  Création rapide (Avec les paramètres par défaut : 4 partitions) ou bien une création personnalisée pour spécifier le nombre de partitions souhaité et la durée de rétention de message (minimum un jour).
Ensuite, il reste qu’à définir le nom du Hub d’évènement, la région et l’espace de noms.
NB : Une fois le hub d’évènement créé, on ne peut pas changer le nombre de partitions.

1

Une fois notre hub d’évènement est créé, nous allons définir les différentes stratégies d’accès partagé dans le panneau Configurer.
Nous allons définir deux stratégies d’accès, une avec l’autorisation Envoyer pour autoriser l’envoi de données via notre Hub d’évènement et une autre avec l’autorisation Ecouter pour récupérer ces dernières. Deux clés d’accès vont être générées automatiquement pour chaque stratégie d’accès créée.

2

Afin d’envoyer les données des vélibs via notre hub d’évènements, il faut créer un applicatif (application Javascript, application .NET utilisant HttpClient, HttpWebRequest, ou utilisant le Service Bus SDK) qui permet de récupérer les données sous format JSON et les envoyer via notre hub d’évènement d’une manière générique en définissant une durée de relance afin d’avoir les données en temps réel.

Création d’une application .NET utilisant HttpClient

Nous allons créer une application .Net « Sender » utilisant httpClient. Pour cela, il faut bien rajouter l’api Microsoft.AspNet.WebApi.Client au niveau de notre projet créé dans le panneau NuGet Package Manager.

3_.NET

Au niveau de l’entête de notre classe Program.cs, nous allons rajouter les lignes ci-dessous :

using System.Net.Http; 
using System.Threading;

Pour définir les paramètres de notre hub d’évènements au niveau de notre classe, nous allons utiliser une signature d’accès partagé « Shared Access Signature » pour garantir la sécurité de notre hub d’évènements et ne pas partager la clé d’accès partagé. Pour générer cette signature nous allons utiliser l’application « Event Hub – Signature Generator » téléchargeable ici.

Après avoir extrait le fichier .Zip téléchargé et lancé l’exécutable, nous allons définir les différent paramètres de notre Hub d’évènement.
Namespace : le nom d’espace de notre hub d’évènements -> velibnamespace
Hub Name : le nom de notre hub d’évènements -> velibhub
Publisher : le nom de l’éditeur
Mode : mode de transport -> Http

NB : Dans le cas d’utilisation du Service Bus SDK, il faut choisir le mode : AMQP

Sender Key Name : Le nom de la stratégie d’accès partager pour l’envoi -> Sender
Sender Key : La clé d’accès partagé pour la stratégie d’envoi -> Sender
Token TTL (minutes) : Durée en minutes
En cliquant sur Generate, on aura notre Signature d’accès partagé.

4

Au niveau de notre méthode Main, nous allons définir les paramètres de notre hub d’évènements.

var sas = "SharedAccessSignature sr=https%3a%2f%2fvelibnamespace.servicebus.windows.net%2fvelibhub%2fpublishers%2flhassab%2fmessages&sig=25cvUSQopqi93IsgWL7T4VKBY5uAjlXOIxSSqwU59fE%3d&se=1516153201&skn=Sender";
// Namespace info. 
var serviceNamespace = "velibnamespace"; 
var hubName = "velibhub"; 
var deviceName = "lhassab"; // publisher

Après cela, nous allons créer notre client en utilisant HttpClient :

// Create client.
var httpClient = new HttpClient(); httpClient.BaseAddress = new Uri(String.Format("https://{0}.servicebus.windows.net/", serviceNamespace)); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", sas); Console.WriteLine("Starting device: {0}", deviceName);

Maintenant il nous reste à récupérer les données sous format JSON ici, construire notre objet EventData en désérialisant le fichier JSON récupéré, l’envoyer vers notre Hub d’évènement en utilisant httpClient.PostAsJsonAsync et définir une durée de relance. Le script est comme suit :

// Keep sending.
 while (true)
 {
var JSON = new WebClient().DownloadString("http://opendata.paris.fr/api/records/1.0/search/?dataset=stations-velib-disponibilites-en-temps-reel&rows=10000");
JSON = JSON.Substring(144, JSON.Length - 144);
 JSON = "{" + JSON;
JToken token = JObject.Parse(JSON);
int count = (int)token.SelectToken("records").Count();
DateTime update = DateTime.Now;
 Console.WriteLine("update : " + update);
 
 for (int i = 0; i < count; i++)
 {
//faire le split sur le champ Adresse pour récupérer l'arrondissement et la ville
 String Arr = "NA";
 String city = "NA";
 String Add = ((String)token.SelectToken("records[" + i + "].fields.address")).Replace(" "," "); 
 int c = Add.Split('-').Count();
if (Add.Split('-')[c - 1].Split(' ').Count() == 3)
 {
 Arr = Add.Split('-')[c - 1].Split(' ')[1];
 city = Add.Split('-')[c - 1].Split(' ')[2];
 }
 else
 {
 if (Add.Split('-')[c - 1].Split(' ').Count() < 3 & Add.Split('-')[c - 1].Split(' ').Count() > 1)
 {
 Arr = Add.Split('-')[c - 1].Split(' ')[0];
 city = Add.Split('-')[c - 1].Split(' ')[1];
 }
 else
 {
 if (Add.Split('-')[c - 1].Split(' ').Count() > 1)
 {
 String s = "";
 for (int j = 2; j < Add.Split('-')[c - 1].Split(' ').Count(); j++)
 {
 s = s + Add.Split('-')[c - 1].Split(' ')[j] + " ";
 }
 Arr = Add.Split('-')[c - 1].Split(' ')[1];
 city = s;
 }
 }
 }
 Console.WriteLine("Adresse : " + Add);
 Console.WriteLine("Arr : " + Arr);
 Console.WriteLine("Ville : " + city);
var eventData = new
 {
 Status = (String)token.SelectToken("records[" + i + "].fields.status"),
 Contract_name = (String)token.SelectToken("records[" + i + "].fields.contract_name"),
 Name = (String)token.SelectToken("records[" + i + "].fields.name"),
 Number = (int)token.SelectToken("records[" + i + "]." + "fields.number"),
 Last_update_pipe = update,
 Bike_stands = (int)token.SelectToken("records[" + i + "].fields.bike_stands"),
 Available_bikes = (int)token.SelectToken("records[" + i + "].fields.available_bikes"),
 Available_bike_stands = (int)token.SelectToken("records[" + i + "].fields.available_bike_stands"),
 Address = (String)token.SelectToken("records[" + i + "].fields.address"),
 Arrondissement = Arr,
 Ville = city,
 Cord1 = token.SelectToken("records[" + i + "].fields.position[0]"),
 Cord2 = token.SelectToken("records[" + i + "].fields.position[1]")
 };
var postResult = httpClient.PostAsJsonAsync(
 string.Format("{0}/publishers/{1}/messages", hubName, deviceName), eventData).Result;
Console.WriteLine("Sent name of station using HttpClient: {0}", eventData.Name);
 Console.WriteLine(" > Response: {0}", postResult.StatusCode);
 Console.WriteLine(" > Response Content: {0}", postResult.Content.ReadAsStringAsync().Result);
 }
Thread.Sleep(600000); //Durée de relance en ms
 }

En exécutant notre applicatif « Sender », on verra bien la création des évènements en envoyant les données via httpClient vers notre hub.

5

6

Création d’un Streaming Analytics Job

Pour créer un Streaming Analytics Job qui va nous permettre de récupérer les données à partir de notre hub d’évènements et les injecter dans un Power BI sous forme d’un DataSet, il suffit de cliquer sur Nouveau au niveau du gestionnaire Azure -> Data Services -> Stream Analytics -> Création rapide en définissant le nom de la tâche, la région et le compte de stockage de surveillance régionale.

7

Au niveau de notre notre streaming analytics Job créé, nous allons définir les entrées, les sorties ainsi que la requête qui va nous permettre de transférer les données.
Nous allons utiliser comme entrée notre hub d’évènement contenant les données vélibs. Dans le panneau Entrées, nous allons ajouter une entrée en cliquant sur Ajouter une entrée –> Flux de données -> Hub d’évènements.

8

En cliquant sur Suivant, nous allons définir les paramètres de sérialisation. Dans notre cas nous allons choisir le format JSON avec le codage UTF8.

9

En ce qui concerne les sorties, nous allons utiliser Power BI comme sortie. Dans le panneau Sorties nous allons ajouter une sortie en cliquant sur Ajouter une Sortie -> Power BI et définir le compte Power BI en cliquant sur Autoriser maintenant.

10

Et enfin définir le nom de la sortie, le nom du DataSet et le nom de la table.

11

Il ne nous reste plus qu’à définir notre requête de transfert de données dans le panneau requête.

WITH LastInWindow AS(
    SELECT
    MAX(CAST(Last_update_pipe as Datetime )) AS [LastProcessed]
    FROM
    inputhub TIMESTAMP BY Last_update_pipe
    Group by
    TumblingWindow(Day, 1)
  )
  Select
  inputhub.Number AS Numero2,
   inputhub.Name AS Station,
   inputhub.Contract_name as Contrat,
   inputhub.Last_update_pipe AS Derniere_mise_a_jour,
   inputhub.Bike_stands as Nbr_Stands,
   inputhub.Available_bikes AS Nbr_velos_dispo,
   inputhub.Available_bike_stands AS Nbr_Stands_Dispo,
   inputhub.Address AS Adresse,
   inputhub.Arrondissement AS Arrondissement,
   inputhub.Ville AS Ville,
   inputhub.Cord1 AS Cord1,
   inputhub.Cord2 AS Cord2
   Into
   veliboutput
   From
   inputhub TIMESTAMP BY Last_update_pipe
   INNER JOIN LastInWindow ON inputhub.Last_update_pipe = LastInWindow.LastProcessed AND
   DATEDIFF(Day, inputhub, LastInWindow) BETWEEN 0 AND 1

En cliquant sur démarrer, nous allons lancer notre job qui permet le transfert de nos données en streaming vers Power BI à partie de l’heure de démarrage définie.

12

En se connectant sur Power BI avec le même compte défini précédemment pour l’autorisation de la connexion, On verra bien notre DataSet créé avec les données vélibs souhaitées.

13

Création du rapport Power BI

Après avoir eu le Dataset de données vélibs intégré dans Power BI, nous allons procéder à la création de notre rapport illustrant la disponibilité des vélos et des stands libres pour chaque station.
Pour faciliter la recherche des stations, nous allons filtrer par Arrondissement, Ville et Station. Pour cela, nous devons utiliser le composant Segment en se basant sur les colonnes Arrondissement, Ville et Station respectivement pour chaque filtre.

14

Nous allons aussi afficher une carte indiquant l’emplacement de la station ou les stations filtrées pour faciliter l’accès en utilisant le composant Carte géographique et en se basant sur la colonne Adresse.

15

On peut utiliser le composant Card with States by SQLBI en le téléchargeant d’ici et l’importer dans Power BI. Ce composant va nous servir comme un indicateur illustrant la disponibilité des vélos et des stands libres à la station filtrée en se basant sur les colonnes nbr_velos_dispo et nbr_stands_dispo respectivement et en définissant 3 états : pas suffisant, suffisant et largement suffisant.

Pour définir ces trois intervalles, il faut introduire le Min et le Max pour chaque intervalle State1, State2 et State3 dans le panneau Format.

16

Nous pouvons aussi afficher l’adresse complète de la station filtrée au niveau de notre rapport en utilisant le composant tableau et en se basant sur la colonne Adresse.

17

Enfin, nous allons rajouter un histogramme pour donner la possibilité de faire une comparaison entre plusieurs stations sélectionnées en utilisant le composant Histogramme empilé et en se basant sur les deux colonnes nbr_velos_dispo et nbr_stands_dispo comme Valeur et la colonne station comme Axe.

18

En faisant ce tutoriel, nous constatons que l’interface de Power BI en ligne n’offre malheureusement pas la possibilité de formater et traiter les données (Contrairement à Power BI Desktop). Pour rajouter une colonne ou faire un split pour en déduire d’autres informations (Arrondissement et ville sont des colonnes déduites de la colonne Adresse), nous somme donc obligés de traiter les données avant leur transmission vers Power BI; soit au niveau de notre classe .Net en désérialisant notre fichier JSON (le cas de notre tutoriel), soit au niveau de notre requête de transfert (via le Streaming Analytics Job).

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s