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).