數(shù)據(jù)加工與數(shù)據(jù)建模-PowerQuery Vs Power BI
本文旨在幫助大家理解在Power Query中加工數(shù)據(jù)與在 Power BI中建模的區(qū)別和內(nèi)在聯(lián)系,在Power BI中生成可視化報(bào)告時(shí),這兩者都會(huì)用到。

相關(guān)閱讀:
概念1: 數(shù)據(jù)建模(Data Modelling)-讀書筆記(3) - 嗶哩嗶哩 (bilibili.com)
DAX 專題2: 計(jì)算列 Calculated Columns-讀書筆記(9) - 嗶哩嗶哩 (bilibili.com)
Power Query基礎(chǔ)篇-1 概述:數(shù)據(jù)分析中ETL概念的含義,M語言的三層組件及PQ的版本區(qū)別。_嗶哩嗶哩_bilibili

在自助BI項(xiàng)目中,我們習(xí)慣把項(xiàng)目的過程分成四個(gè)階段,獲取和加工數(shù)據(jù),數(shù)據(jù)建模,可視化報(bào)告,數(shù)據(jù)共享,如下圖

上面的圖片從邏輯上展示了數(shù)據(jù)從源開始到最后生成可視化報(bào)告的轉(zhuǎn)化過程(從左到右)。在問題解決之前,你可能會(huì)不斷的反復(fù)這個(gè)過程,直到得到滿意的結(jié)果。今天我們只講上面四個(gè)步驟中的兩個(gè):數(shù)據(jù)的加工和數(shù)據(jù)建模。
數(shù)據(jù)的獲取清洗在Power Query中完成,建模是Power BI要完成的事兒,數(shù)據(jù)清洗和建模是生成可視化報(bào)告時(shí)都要用到的。
一、數(shù)據(jù)加工
數(shù)據(jù)加工是從數(shù)據(jù)源獲取數(shù)據(jù),轉(zhuǎn)換數(shù)據(jù)然后加載到 Power BI的過程,這個(gè)過程就是我們常聽到的數(shù)據(jù)處理ETL的概念(ETL是Extract,Ttransform and Load的縮寫 )。數(shù)據(jù)加工通過包括以下步驟:
重構(gòu)從數(shù)據(jù)源獲取到的數(shù)據(jù)表,以達(dá)到做可視化報(bào)告的數(shù)據(jù)源要求。通常我們從源拿到的數(shù)據(jù),從結(jié)構(gòu)上或數(shù)據(jù)的維度上都不能滿足Power BI的使用需要,所以我們要避免直接從源拿到數(shù)據(jù)后就加載到Power BI。
只保留需要的數(shù)據(jù)行或表的列,只加載需要的數(shù)據(jù),用不到的一點(diǎn)也不保留。即使后續(xù)有需要(某些數(shù)據(jù)行或表的列),也很容易根據(jù)變更的需求把數(shù)據(jù)加載上來。
把確認(rèn)需要的數(shù)據(jù)提前在數(shù)據(jù)表中進(jìn)行聚合運(yùn)算好,盡管我們通常不強(qiáng)烈建議這樣做,但總有例外不是。
把所有要用到的數(shù)據(jù)表加載到Power BI數(shù)據(jù)模型。(有時(shí)也不是必須全部加載,例如數(shù)據(jù)清洗過程的中間查詢就沒必要加載)
如果可能的話,這些加工的活兒在關(guān)系型數(shù)據(jù)庫里完成最好,否則,我們就要在Power Query中完成這些。
二、數(shù)據(jù)建模
數(shù)據(jù)建模的過程就是設(shè)計(jì)數(shù)據(jù)表結(jié)構(gòu)、建立 表間關(guān)系和編寫度量值的過程,這些工作的目的就是抽象出可視化報(bào)告中的業(yè)務(wù)見解。建模一般包括下面幾個(gè)步驟:
決定要加載哪些數(shù)據(jù)表(或者不加載哪些數(shù)據(jù)表)。
確定數(shù)據(jù)模型的模式,模型中有一張、兩張還是多張表,還是建議大家采用星形結(jié)構(gòu)的數(shù)據(jù)模型。
確定好表名和表的列名。
確定好是采用大寬表,還是窄表(列很多的表,還是列較少的表)
表間關(guān)系連接(在各種表之間按規(guī)則進(jìn)行連線)
依據(jù)加載到模型的數(shù)據(jù),根據(jù)業(yè)務(wù)邏輯和表關(guān)系編寫好度量值,以供可視化報(bào)告使用以形成業(yè)務(wù)見解。
設(shè)置好度量值格式,以滿足報(bào)告需要。(像貨幣、百分比、小數(shù)等格式)
給度量值命名時(shí)也要遵守便于識讀理解、記憶、符合業(yè)務(wù)需要的原則,使用者一看度量值 名字就知道要計(jì)算出啥。
綜上所述,要加載哪些數(shù)據(jù)是建模的工作,重構(gòu)數(shù)據(jù)是數(shù)據(jù)加工的活兒,數(shù)據(jù)加工與數(shù)據(jù)建模還存在很多內(nèi)在聯(lián)系,二者也不能一刀切地分開。
三、數(shù)據(jù)加工與數(shù)據(jù)建模的關(guān)聯(lián)性
? ? ? ? 比較容易弄蒙Power BI初學(xué)者的一件事兒是:至少有兩種方法能完成添加列的工作,你可以在Power Query添加列,也可以在Power BI中用DAX添加計(jì)算列。當(dāng)然還有另一種方法,就是在數(shù)據(jù)源的源文件(數(shù)據(jù)庫表或者其它形式的數(shù)據(jù)源文件)中添加列。不管采用哪種方法完成添加列,是否添加列以及添加列的內(nèi)容,都應(yīng)該根據(jù)數(shù)據(jù)模型來確定。這是一個(gè)有爭議的問題,關(guān)于實(shí)際添加計(jì)算列的過程算是數(shù)據(jù)加工還是數(shù)據(jù)建模?本文認(rèn)為它是一個(gè)數(shù)據(jù)加工的過程,最好在Power Query中完成。
? ? ? ?所以說,究竟用哪種方法添加列呢?這取決于你想做什么?我給大家的建議是在離數(shù)據(jù)源文件盡可能近的端完成添加列。
?在數(shù)據(jù)源文件中添加列,比例在數(shù)據(jù)倉庫中就把想添加的列加上,當(dāng)然這可能需要IT小組的人協(xié)助完成。
在Power Query中完成添加列。
在Power BI中通過DAX添加計(jì)算列。
?如此排列上述三個(gè)步驟的先后順序是有原因的:
??? 如果在數(shù)據(jù)源文件中添加列,那么這些數(shù)據(jù)源文件不僅能滿足當(dāng)前BI項(xiàng)目的需求,也能滿足未來的需要,更方便其它BI用戶使用。在源頭添加列提供了最大的數(shù)據(jù)復(fù)用性,如果以后需要進(jìn)行更改,維護(hù)的工作量很少。然而,現(xiàn)實(shí)的情況往往是由于各種原因,你無法給源文件添加列或做變動(dòng),或者至少無法迅速實(shí)現(xiàn),因此,對于自助式BI用戶來說,這種方法通常不好實(shí)現(xiàn)。
? ???如果在Power Query中添加列(或在源文件中添加列),則在數(shù)據(jù)加載過程中,添加的列將與其他所有列一起加載和壓縮。這意味著更高的整體表壓縮率,會(huì)讓模型文件更小,整體運(yùn)行效果也更好,它還將所有的數(shù)據(jù)加工任務(wù)集中在一起,這使得數(shù)據(jù)查找更加直觀,模型也更容易維護(hù)。
通常只有在其他兩種方法不好實(shí)現(xiàn)時(shí)我們才在PBI中使用添加計(jì)算列。選擇添加一個(gè)計(jì)算列(使用DAX方法)的最常見原因是需要利用現(xiàn)有模型的內(nèi)容來創(chuàng)建新數(shù)據(jù)。
以Adventure Works數(shù)據(jù)模型為例,假設(shè)你想將客戶分為高銷售量、中銷售量和低銷售量三個(gè)等級,就需要在客戶表中添加一個(gè)新的列(這是一個(gè)建模決策),以便在報(bào)表中使用該列(包含三個(gè)等級的列)作為一個(gè)切片器。如果你想在Power Query中完成這個(gè)任務(wù),那將會(huì)產(chǎn)生額外的工作量。你得在Power Query計(jì)算出每個(gè)客戶的銷量,那還需要做下面4件事兒:
1.把銷售表和客戶表做橫向連接。
2. 把每位客戶的銷售做聚合運(yùn)算。
3.用衡量高銷售量、中銷售量和低銷售量三個(gè)等級的數(shù)值按客戶銷量將客戶分為三類。
4. 添加等級新列。
??? ?重點(diǎn)來了,上述第1和第2步可能在數(shù)據(jù)模型中已經(jīng)有了,Adventure Works示例模型中已經(jīng)有了一個(gè)客戶表,與銷售表的關(guān)系以及一個(gè)用于計(jì)算銷售量的度量值。利用模型使用DAX很容易添加新的計(jì)算列。簡而言之,當(dāng)計(jì)算列利用了模型的邏輯(度量值和表關(guān)系),使得不必在Power Query中重復(fù)這個(gè)邏輯時(shí),應(yīng)該優(yōu)先選擇計(jì)算列。
結(jié)論:
在PBI中能添加計(jì)算列,但也不是必須的,不要忘了度量值 可以代替計(jì)算列,不到不得已的時(shí)候不給模型添加新列。