PowerBI Streaming using Azure blob storage

PowerBI 是一個功能強大且高度視覺化的報表工具,除了畫面的美觀與互動性。消費者可以還會關心它對資料的整合性,例如多資料源、巨量資料、社群資料…等。其中有些人也會在意,它是否能介接 Streaming串流型的資料?來實現更即時的監控報表呈現。本篇將以Azure blob storage為資料源,示範如何使用Tile元件來達到這個需求。

由於之前已經介紹過 PowerBI streaming的原理,所以本篇就從它到底能支援哪些即時資料集,包含了之前介紹過的PubNub 串流資料集、推送資料集、串流資料集(細節可以參考官網的說明)。

  1. PubNub streaming dataset 請參考之前的這一篇
  2. Push dataset 指的就是由資料源不斷地將更新資料送給PowerBI來呈現,它的限制最少,但是成本會比較高。你可能會問我說Professional版本不是Saas服務,10元美金/月(吃到飽),哪來的比較高的成本?我這邊指的是資料來源的成本,不是PowerBI這邊的成本。(但是當你使用磚時,資料並不會自動被更新,而是被動地等到資料源將資料送過來。若你是使用Q&A功能,它是會主動去向資料源要資料的)
  3. Streaming dataset 就是應用 PowerBI service中的 Cache來顯示資料,例如以折線圖、卡片…等元件,以少量多餐的方式Ingest資料細節可以參考這一篇。然而由於先天上的限制,它只接受你使用Tile磚的方式並選擇自訂資料集來使用它,不支援 Q&A。它每秒可以處理5個Request,每次可以處理 15KB的資料量,所以上限是75KB per second
    **另外這類型的串流資料處理,先天上就應該是以很單純的資料格式送過來,不要去做任何彙總運算(Sum小計、Avage平均),否則它的延遲就會很嚴重,即使是較少量的 Streaming dataset 做了彙總後也是會卡鈍的…

首先你要準備一個 Dataset 資料集(JSON格式),接著再登入 PowerBI Web 進行以下操作:

在My workspace中右上角的 + 新增一個 Streaming dataset
最近 Web side有一些改版,layout 可能會從中間偏左來進入 Create功能

然後選擇三大分類中的 API
為 dataset 取一個名稱,然後指定欄位名稱與資料型態。然後下面有一個示意方框,來協助你選對適合的資料型態
當你按下 Create 系統會產生一網址給你,你需要把畫面中的 URL 貼到你的程式碼中
如果太快按 Done,還是可以在 MyWorkspace中找到

接下來可以參考以下的程式碼,把資料庫Table中的資料,透過REST API 以每5秒鐘發送一次,就能呈現出 realtime的 streaming 效果。系統會利用professional 帳戶中10GB的容量,幫你的資料把存在 Aure blob storage

​
import urllib, time, pyodbc
import pandas.io.sql as psql
import urllib.request
from datatime import datatime

REST_API_URL = "<Insert your push URL>"
cnincome = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};SEVER=MyMachine\SQLSERVERINS:DATABASE=TestDB:Trusted_Connnection=yes')
cursor = cnincome.cursor()
sqlIncome="select * from tblIncome with(nolock)"

flag=1
while(flag):

dfIncome = psql.read_sql(sqlIncome, cnincome, index_col-'EffortID')
dfIncomesummary = dfIncome.groupby(['name']).agg({'Effort':['sum']}).rest_index()
dfIncomesummary.columns = ['DomainName','Effort']
dfTotalIncome = dfIncomesummary.agg({'Effort':['sum']})
dfTotalIncome.columns = ['TotalEffort']

data=bytes(dfTotalIncome.to_json(orient='records'),'utf-8')

req=urllib.request.Request(REST_API_URL, data)
response = urllib.request.urlopen(req)

time.sleep(5)

再回到 PowerBI Web 選擇 Create dashboard/ tile 磚以及 Custom streaming data
然後開始設計你所需要的 Report or Dashboard

 

李秉錡 Christian Lee
Once worked at Microsoft Taiwan