Ein perfektes Datenmodell, gut designt und schnell als in-memory Power BI Dataset, als Basis für Standard und neue Self-Service Reports. Das Refresh für aktuelle Daten wird in der Nacht durchgeführt.

Nun möchte man aber auch weitere kleine Daten erfassen, z.b. Kommentierungen oder ein Status wird umgestellt, diese Daten gehen zurück in das Data Warehouse, z.b. mit PowerApps – aber im Report sehen wir sie leider erst morgen…

Natürlich will der Benutzer die Daten sofort sehen!

Dafür gibt es doch eine ganz einfache Lösung: die Refreshes im Power BI Service…
Aber leider nur 8 mal pro Tag, bei Premium zumindest 48.

Also braucht es ein andere Lösung!

Refresh mit REST API

Das Refresh kann ja auch über eine API ausgelöst werden und somit zu einem kontrollierten Zeitpunkt in einem sequenziellen Gesamtprozess, typischerweise als letzter Schritt in einer Beladungskette.

Zwar auch nicht ganz simpel im Setup, aber funktioniert gut mit der Azure Datafactory mit einem Service Pricipal und sieht in etwa so aus:

In der Luxusvariante wird auch der Status und Fehler abgefragt mit einer Loop, da dieser Web-Call asynchron läuft.

Alle 5 Sekunden wird geprüft ob das Refresh fertig ist, bzw. ein Fehler protokolliert:

Naiv und bequem wie ich bin, möchte ich mit dieser Methode nun eine einzelne Tabelle refreshen.
Das Refresh vom ganzen Modell mit 100 Tabellen und zahllosen Relations würde 40 Minuten dauern, obwohl sich die Daten nicht geändert haben, also möchte ich nur die Eingabetabelle der Benutzer processen, was in 3 Minuten fertig ist.

Doch da werde ich enttäuscht…

Leider gibt es kein Table Refresh in der API!

Was AAS bietet, kann man bei PBI leider nicht haben, also ist wieder ein neuer Lösungsweg notwendig.

Refresh mit Power Shell

Das Power Shell Cmdlet für AS kann auch für Power BI angewendet werden um eine einzelne Tabelle zu processen.

Wenn ich als Programmiermuffel schon für eine Standard-Aufgabe programmieren muss, dann stelle ich mir vor, dass ich wenigstens das Script einfach in der Datafactory aufrufe, aber auch hier werde ich enttäuscht, denn das gibt es nicht.

Also wandert das Power Shell Script in einen Automation Account.

Das Power Shell wird über einen Web Call im Automation Account gestartet.

Data Factory Aufruf vom Runbook

Für den Aufruf braucht es noch einen Webhook vom Runbook, mit dieser Adresse kann das Runbook dann gestartet werden.

In der Datafactory braucht es jetzt nur mehr diesen Webcall um das Runbook mit dem Powershell zu starten.

Die Parameter für Datenbank, Tabelle, etc. werden gesetzt und Credentials über einen KeyVault ermittelt.

Die notwendigen Parameter werden als gesamter JSON-Body an das Runbook übergeben und dort wieder decodiert.

Der normale Web Call ist asynchron, daher verwendet man den WebHook, damit dieser wartet bis das Refresh fertig ist.
Das funktioniert aber nur, wenn callback gesetzt ist, aber auch im Power Shell der Callback explizit aufgerufen wird als letzter Schritt!

Zeitsteuerung

Die Benutzereingaben sind nur untertags relevant und das Table Refresh soll sich auch nicht in die Quere kommen mit dem Daily Load, also gibt es noch eine zusätzliche Parameter-Steuerung, ob das Refresh ausgeführt werden soll, abhängig von der Uhrzeit.

Trigger für ständiges Refresh

Damit das Table Refresh möglichst oft aktualisiert, wird ein Trigger alle 15 Minuten gefeuert der die Pipeline ausführt.

Eine Metric zeigt zur Kontrolle die Läufe mit der Pause in der Nacht.

Zusammenfassung

Die Lösung für ein Table Refresh in Power BI sieht also so aus:

  • Setup für App Registration, Service Principal, KeyVault Zugriff
  • Power Shell Script für das Table Refresh mit Parametern
  • Runbook mit dem Power Shell Script mit einem WebHook
  • Data Factory holt über ein KeyVault Credentials und führt über einen WebHook das Runbook aus
  • Ein scheduled Trigger ruft regelmäßig das Refresh auf

Conclusio

Einzelne Tabellen zu refreshen ist eigentlich nicht vorgesehen, aber in der Praxis durchaus oft gewünscht und sinnvoll.

Mit dieser doch komplizierten Lösung aus verschiedenen Komponenten ist dies aber durchaus stabil umsetzbar und sogar möglich, Daten aus dem Power BI Dataset „near realtime“ anzuzeigen.

Teile Deine Erfahrungen mit einem Kommentar unten!