Łukasz Bielak

Łukasz Bielak

Streaming Dataset w Power BI

Platformy danych oferujące dane w czasie niemal rzeczywistym to coraz popularniejsze rozwiązanie. Zamiana batchowego ładowania każdego dnia na streaming, umożliwia nie tylko bieżący wgląd w działanie biznesu, ale także podejmowanie decyzji na bieżąco. Power BI jest narzędziem, które można wykorzystać do wizualizacji strumieni danych (streaming). Wiąże się to z pewnymi ograniczeniami, ale więcej opowiem w tym artykule.

Czym jest streaming i jakie ma zastosowanie?

Streaming, to technika transmisji danych, polegająca na wysyłaniu porcji z pewną częstotliwością w sposób nieprzerwany. Oczywiście nie jest to żadna bardzo precyzyjna definicja, ale mniej więcej wyjaśnia o co chodzi. 

Pytanie tylko kiedy i gdzie streaming będzie użyteczny? Przede wszystkim wtedy, gdy potrzebujemy podejmować dane w czasie rzeczywistym – np. kiedy nasza firma zajmuje się dostarczaniem jedzenia i chcemy uniknąć opóźnienia dostaw. Zawsze może zdarzyć się zator i w takiej sytuacji kierownictwo może podjąć jakąś akcję, np. zwiększyć liczbę kierowców. Jednak to tylko przykład, monitorowanie biznesu i podejmowanie decyzji na bieżąco może przynieść dużą wartość.

Power BI Push Dataset

Power BI Service oferuje obsługę danych strumieniowych, a do dyspozycji mamy dwa typy datasetów. Pierwszy z nich to Push Dataset. Czym różni się od klasycznego datasetu? Możemy tam ładować dane za pośrednictwem API oraz tworzyć nowe obiekty, np. tabele czy relacje. Co to oznacza w praktyce? Mianowicie jesteśmy w stanie zbudować model danych wykorzystując tylko i wyłącznie API, a także ładować do niego dane. To znaczy, że w możemy napisać kod w pythonie, który będzie tworzył nowe tabele w modelu danych. Następnie jesteśmy w stanie utworzyć streaming w databricksach, który będzie ładował dane bezpośrednio do tabel modelu.

W odróżnieniu od klasycznego podejścia tutaj ładujemy dane, a nie pobieramy je ze źrodła podczas procesowania. Takie rozwiązanie ma oczywiście pewne ograniczenia, które można sprawdzić tutaj. Oznacza to, że nie może być traktowane jako równorzędne z analitycznymi bazami danych. Jakie mogą być potencjalne przypadki użycia? Proste modele z niewielką liczbą rekordów, którymi chcemy zarządzać z poziomu kodu. Warto zaznaczyć, że aby taki model obsługiwać potrzebne jest dodatkowe konto techniczne z licencją pro.

Power BI Streaming Dataset

Rozwiązanie znacznie prostsze od poprzedniego, przeznaczone raczej do bardzo prostych modeli, wręcz do jednej tabeli i prostych miar. Jak poprzednio, dane ładujemy za pośrednictwem API, ale nie jest konieczne osobne konto serwisowe. Wystarczy jedynie link wygenerowany w Power BI Service podczas tworzenia datasetu. Na bazie streaming datasetu możemy tworzyć dashbordy, które będą prezentowały dane w czasie rzeczywistym, bez konieczności odświeżania. Przypadkiem użycia może być odczyt temperatury z urządzeń IoT. Taka temperatura będzie prezentowana na dashboardzie, a jej wartość będzie automatycznie odświeżana. Można zwrócić uwagę, że przecież jeśli skorzystamy z opcji direct query, to również możemy uzyskać taki efekt. Natomiast w przypadku streaming datasetu nie ma konieczności ustawiania jakiegokolwiek harmonogramu odświeżania raportu. Należy pamiętać, że to rozwiązanie jest przeznaczone do prostych zastosowań i ma pewne ograniczenia co do wielkości wiersza. Warto na nie zwrócić uwagę, w szczególności, że jeśli będziemy wysyłać zbyt duże porcje danych, to mogą być one po prostu „gubione”.

Trochę praktyki - czyli tworzenie i ładowanie streaming datasetu

Zacznijmy od tego, że naszym źródłem danych będzie Wikipedia. Za pośrednictwem API możemy pobrać informacje o ostatnio modyfikowanych wpisach. Te dane trochę obrobimy, usuwając niepotrzebne kolumny i załadujemy do Power BI za pośrednictwem API. Następnie przygotujemy raport, który będzie prezentował dane w czasie rzeczywistym.

Do dzieła!

Pierwszą czynnością jest oczywiście utworzenie streaming datasetu. Aby to zrobić, logujemy się do Power BI Service, w wybranym obszarze roboczym klikamy nowy, a następnie wybieramy zestaw danych transmisji strumieniowej.

Kolejnym krokiem jest wybranie opcji API, podanie nazwy i wpisanie pól, jakie będą w datasecie. Istotne, aby typy danych były wybrane prawidłowo, w przeciwnym razie na raporcie nie zobaczymy rekordów, a żaden błąd nie zostanie zwrócony, co może być nieco mylące. Po utworzeniu dostaniemy adres naszego API.

Teraz pora na utworzenie mechanizmu ładującego dane. Wykorzystamy tutaj notatnik Databricks, a instrukcje bedą pisane w języku python. Pierwszym krokiem będzie import niezbędnych bibliotek.

				
					import pyspark.sql
import time
import requests
import json
				
			

Następnie ustawiamy wartości zmiennych. W urlPBI wpisujemy adres, który pobraliśmy w poprzednim punkcie. Zmienna urlWiki to adres do API Wikipedii, a paramsWiki to parametry, które opisują jakie dane chcemy pobrać. W naszym konkretnym przypadku będą to dane w formacie json, a rekordy będą opisywać ostatnie zmiany w artykułach Wikipedii. Zaznaczamy również, że chcemy pobrać 10 rekordów, które są typu edit lub new. Więcej informacji na temat API w oficjalnej dokumentacji.  

				
					urlPBI = ""

headers = {
  "Content-Type": "application/json"
  }

urlWiki = "https://en.wikipedia.org/w/api.php"

paramsWiki = {
    "format": "json",
    "list": "recentchanges",
    "action": "query",
    "rctype": "edit|new",
    "rclimit": "10"
}
				
			

W kolejnym kroku zbudujemy prostą pętlę, która co 5 sekund będzie odpytywała API o dane, po czym wykonywana będzie prosta transformacja, polegająca na pobraniu tylko 3 kolumn z całego zbioru. Ostatnim krokiem będzie ładowanie danych do API PBI. Po każdej iteracji ilość danych w naszym modelu zwiększy się. Cały notebook jest dostępny tutaj

				
					while 1:
     wikiData = requests.get(url=urlWiki, params=paramsWiki).json()
     recentChanges = spark.createDataFrame(wikiData['query']['recentchanges']).select('type', 'title', 'ns')

     requests.post(url=urlPBI, headers=headers,
                  data=recentChanges.toPandas().to_json(orient='records'))
     time.sleep(5)

				
			

Aby przetestować nasze rozwiązanie możemy utworzyć dashboard i dodać do niego kafelek, który w czasie rzeczywistym będzie pokazywał wartość kolumny ns. Zwróć uwagę, że wartość aktualizuje się automatycznie, nie ma konieczności manualnego odświeżania jak w przypadku direct query.

Podsumowanie

Jak widać, streaming dataset to ciekawa funkcjonalność, która w niektórych przypadkach może urozmaicić możliwości raportowania w naszym systemie. Absolutnie nie należy jej póki co rozważać jako zastępstwa dla klasycznych datasetów, ze względu na różne ograniczenia. Po więcej informacji zapraszam do oficjalnej dokumentacji (streaming dataset, push dataset).

Udostępnij post

Share on facebook
Share on twitter
Share on linkedin
Share on print
Share on email

Pozostańmy w kontakcie

Jeżeli chcesz być na bieżąco informowany o nowych wpisach oraz dostawać materiały, których nie publikuję na blogu - zapisz się do newslettera!