Tableau基礎·如何合併你的數據? 理解與邏輯
"我是Tableau手冊的深度解說家,而非官方文檔的搬運工。"
原創作品,歡迎分享,禁止抄襲。
在業務分析中,我們經常會遇到下面的各種問題?
- 我想在訂單分析中體現門店的分類訊息怎麼辦?
- 在會員的靜態表分析中,我想把會員和貢獻的貢獻額結合起來怎麼辦?
- 如何把來自多個部門的分析數據合併起來呢?
- 部分數據需要清理,應該在清理前連接還是清理后連接?
在大數據分析過程中,我們會頻繁的遇到需要把數據結合到一起的情形;在Tableau中,數據聯結在一起有多種方式;而在合適的地方選擇合適的方法,是確保數據準確和性能的基礎。
- Tableau數據合併的方法及選擇
- Tableau數據連接與數據混合的對比
- Tableau數據連接的多種可能
數據混合Blend是聚合級別的數據聯結,而數據連接join則是行級別的。 基於行級別連接只有一個數據源,隨意更改會破壞所有的視圖結果;而數據混合則保持了兩個數據源的獨立性,可以在每個視圖上靈活修改。
因此,我喜歡稱 數據混合為可以靈活調整的"軟聯結",而數據連接為返回靜態結果的"硬聯結"——前者更靈活,後者更安全。
——喜樂君
一、三種聯結方式與數據並集
在具體展開之前,我們先統一一下概念,我用「數據聯結」(Data Connect)代表最為廣義的統稱,意指把來自不同數據源的數據結合在一起。 在Tableau中,根據不同的合併方式和數據處理階段,使用了不同的用詞,其一是Data Union,翻譯為"數據並集",用於相同數據解構的上下追加,其二是Data Join,翻譯為"數據連接",用於有共同連接字段的數據左右相連,其三是Data Blend,翻譯為"數據混合",用於視圖層面數據聚合後的聯結查詢。
這裡的關鍵區別是:並集需要數據結構一致、連接會在行級別增加數據的欄位數量、數據混合不會生成新的數據源只是聚合查詢。

1、數據並集
"數據並集"最容易理解,它用於數據結構完全一致的數據的合併,比如將分別存放的12個月的訂單數據csv文件合併,合併不會增加新的列(Tableau自動生成的path和sheet除外),只是將不同文件的數據追加在一起(增加了行行數)。 因此,並集一般在早期的數據處理階段就執行。 比如在下圖中,我們手動把各個月的訂單數據拖到右側的並集中,就把結果合併在一起。

只要數據結果完全一致,數據並集並不會增加新的欄位;不過在Tableau中,系統自動生成幾個輔助字段,來説明查看並集的數據來源。 在一些情況下,我們可以使用這個輔助欄位,比如在上面的數據中,各月的數據中沒有包含"日期"字段,我們可以使用path字段來生成日期欄位。

2、略說 數據聯結join和混合blend
相比數據並集,數據連接和數據混合不太容易區分,也是我們後面的重點。
簡單的說,數據連接是在行級別聯結數據的方式,而數據混合是在指定的聚合級別聯結數據的方式。
【Jul 20, 2019補充】換一種方式說,所謂的數據混合,並沒有生成一個單獨的數據源,而只是數據查詢而已——根據主數據源的視圖要求,從輔數據源做了對應的聚合查詢。 在多次客戶服務和培訓之後,我想這是簡單易懂的理解數據混合的關鍵。
從這個角度去區分,更容易理解以下的特徵:
- 數據連接一般在構建視圖之前就處理,而數據混合是在構建視圖過程中根據需要處理;
- 數據連接容易產生數據垃圾(冗餘),因為它是行級別的運算;
- 數據連接的結果是靜態的,不能更改;而數據混合可以根據連接欄位的不同組合改變連接的結果,相當於指定了在哪個聚合層面做數據連接;
- 數據連接更慢,它是行級別的操作。
二、數據連接 Join
舉例來說:假定我們有兩組數據,它們有共同的標題字段。 分析之前,我們想要把兩個數據結合在一起。 連接有四種方式:查找共同的內容(內連接)、左側為基準追加右側數據源的其他欄位(左連接)、右側為基準、重複項同時保留差異(外連接)。 用資料庫的專業術語,就是:內連接、左連接、右連接和全連線。 (有資料庫基礎的可直接跳過本段)

表的連接是關係型資料庫的核心問題。
下面,我們用幾行數據來解釋四種連接的類型,後面我們會在此基礎上講解Tableau連接的高級用法。
1 內連接 inner join
最常用的是內連接,也就是根據關聯字段查找兩側數據的重複項。 如下圖,我們用兩側的"維度"字段做連接,結果就是返回三行相同的數據,拋棄了其他的相關數據。

2 左連接 Left join
那如果是左連接呢? 也就是以左側為主,不僅匹配相同數據,同時保留左側的不匹配數據,相當於在上面的基礎上增加了左側的B、C兩行,需要注意不匹配的專案中,右側數據的字段會用「空值」填充,往往用null來代替,而不是0. 範例如下:

3、右連接 right join
右連接的結果也就容易理解了,相當於在內連接的基礎上追加了右側數據的不重複數據,範例如下:

4 外連接 out join
外連接相當於既保留了重複項,也保留了不重複項,不匹配的欄位用空值代替,範例如下:

所有的數據連接都是這四種連接方式之一,沒有例外。 「補充Jul 20, 2019」但是有人會說,我左側的數據是訂單數據,右側的是退貨訂單,我想要從左側訂單數據中刪除退貨訂單,屬於哪個類型呢? 其實是上面兩個類型的計算,使用Tableau的連接功能,可以非常簡單的實現以下連接。 這個我們會放在後面部分單獨講解。

5、數據連接屬性 data join
用上面的圖片我們再來說一下「數據連接」join的幾個特徵,
其一,數據連接是在行級別的連接,左側數據源的「維度」列的A行在右側找到了相等的匹配項,就會在A行的後面追加右側的欄位「度量2」,預設會把右側所有欄位全部追加到後面;因此:
其二,行級別連接預設追加所有欄位的方式,會產生大量的數據垃圾(冗餘),想像一下,如果我們只想要右側的一個字段,但是右側數據源有30個字段,這30個字段都會被追加到同一個數據緩存中。 如下圖,右側十幾個欄位全部被連接進來:

如果我們一方面想要數據連接,另一方面不想因為數據垃圾影響性能怎麼辦? 使用數據混合,也就是在構建完視圖之後,根據需要去查詢,而非底層連接數據。
6、跨數據來源的數據連接(增補)
在Tableau 10版本之後,推出來了跨數據源的數據連接,其本質與此前一致,卻極大的擴大了數據連接的應用範圍。 和預設情況下的 同一數據源的不同數據表連接相比,相當於同時把SQL查詢發送到兩個數據源位置。 我們可以用範例圖做一個簡單對比,如下。

三、數據混合Blend
和數據連接相比,數據混合是在指定的聚合級別對數據進行"合併"(沒有真正的合併,其實只是在視圖上在一起);它的結果,依賴於我們的操作。 數據混合如何能避免上面的數據垃圾呢? 這就需要瞭解它的運行機制。
每個數據混合都有一個主數據源,和至少一個輔助數據源,後者用橙色標記。 主輔關係一旦確定不能更改,想要更改必須重建。

1、數據混合的運行方式
數據連接是在行級別的數據合併,預設會合併所有欄位,生成一個數據表;之後我們在檢視中使用數據連接的結果。 而數據混合本質上不是數據聯結,而是數據跨數據源查詢,當我們指定了數據混合的連接欄位,然後使用這些欄位或其他欄位時,Tableau把我們的拖拽轉化為一次查詢,從第二個工作表中查找結果,然後返回並展示到檢視中。 因此,數據混合只會返回我們拖拽的字段的聚合結果,這樣就減少了數據垃圾。 我借鑒了Tableau大神 Milligan的圖,翻譯說明如下:

比如說上面的「月訂單數據」和「客戶數據」,我們用數據混合的方式建立關聯。 在Tableau中,系統會自動推薦匹配的欄位。 如果我們希望修改或者建立更多匹配,可以從頂部功能表「數據」——"編輯關係"通過"自定義"添加或編輯即可。

這裡需要注意,首先在視圖中引用的數據源會被認定為"主數據源",另外的數據源即為"從數據源"。 當我們從主數據源加入一個字段,然後從從數據源中把另一個字段加入視圖時,Tableau背後的計算邏輯是以關聯字段為匹配依據,從"從數據源"中返回相應的匹配項,顯示到視圖中。 因此,它並不會引用其他的任何字段,如此一來,沒有了數據冗餘,速度也就更快。

2、在數據混合中更改聯結的詳細級別
我們說數據混合優於數據連接的一個地方在於可以在構建視圖過程中指定聯結的欄位,聯結字段決定了聯結的聚合級別。 我們看一下官方範例工作簿「超市」,有一個工作簿"性能",分析了每個月不同細分的銷售達成情況。
注意檢視的詳細級別是"類別*月*細分",為了確保在同一個聚合級別做數據混合,我們把 從數據源"銷售目標"的三個維度字段點亮(注意後面的鏈條圖表)。 這樣主數據源「每個類別下、每個細分的每個月」銷售目標,就對應了從數據源中相同聚合級別的數據——在這裡使用了全部字段,相當於實現了行級別的聯結。

如果我們從上面的視圖中移除「細分」欄位,也就是詳細級別改為了「每個類別每個月的銷售額」,這時我們當然希望數據混合的聚合級別保持不變,Tableau也恰好如此聰明,結果是下面的圖:

也就是說,數據混合可以根據視圖需要,在不同聚合級別實現數據聯結;而不像數據連接join的結果如此確定性、難以靈活更改。
因此,我喜歡稱 數據混合為可以靈活調整的「軟聯結」 而數據連接為返回靜態結果的「硬聯結」。
【好奇者補充說明】
上面的數據混合是高於行級別的混合,Tableau會自動調整,即便我們再點亮"細分"字段,結果也不會有差異,因為更高聚合的銷售目標其實也是更低詳細級別的聚合而已。 但是如果我們的檢視是更低的詳細級別,比如"類別*月*細分",而我們此時把默認的聯結的三個字段關掉一個"細分",視圖就會明顯的變化。 結果就是:
- 視圖:銷售額:類別*月*細分的詳細級別;
- 目標值:類別*月。

3、數據混合的特殊情況
既然數據混合是一次查詢,那麼就會出現找不到或者找到了無法返回的情況,比如主數據源的"A公司"在輔數據源中對應了三條不同的"子公司",那麼當我們把"子公司"拖到視圖中,視圖無法同時顯示三條數據,因此就會返回 星號" * ",代表這裡的屬性不是唯一的。 這表示單個標記中的多個維度值,因為數據混合使用聚合結果並將它們合併在視圖中。
另外,如果存在多維數據源,那麼多維數據只能作為主數據源。
四、如何選擇數據聯結的類型
前幾天培訓回來,發現大家依然難以迅速建立如何選擇數據聯結方式的方法意識,這裡缺少一個明確的判斷邏輯。 這個邏輯有很多種表達方式,我坦言還沒有找到最佳的判斷方式,權且先用下面的這個圖來展示。
1、選擇數據類型的基本邏輯

(1)當且僅當多個數據的數據結構完全一致時,才使用數據並集
數據並集就是不同數據源的上下追加,它會讓數據越來越長,而非越來越寬。
(2)當且僅當行級別的數據有必要性和意義時,才使用數據連接
數據連接是「硬連接」,它會延長前一個數據源的欄位數量,一旦連接就不要再想斷開——除非以所有檢視重建為代價。
(3)如果需要數據提前整理,特別是需要提前聚合之後再聯結時,使用數據混合
特別是遇到日期類別的聚合,比如只有一個日期欄位,但是想要在"年"的層級上聯結兩個數據源的字段,就要使用數據混合。。

2、合適選擇數據混合(補充)
數據混合是一種靈活的數據聯結方式,在一下情況下推薦使用:
(1)您想要合併的數據來自跨資料庫聯接不支援的不同資料庫。
跨資料庫聯接不支援多維數據集連接(例如 Oracle Essbase)或一些純數據提取連接(例如 Google Analytics)。 在這種情況下,設置您需要分析的數據的單獨數據源,然後使用數據混合在一個工作表上合併數據源。
(2)數據位於不同的詳細級別。
(3)您有大量資料。
數據混合將數據聚合到適當的級別,然後在檢視中將其合併。 在某些情況下,這種操作順序的變化可能帶來性能優勢。
五、 資料連接與數據混合的高級區別
1、數據連接支援更複雜的判斷,比如"不等於""大於等於",而數據混合只支援"相等"這一種。 數據連接join連接方式更加多樣,而數據混合更加靈活
比如會員分析中,我想查找此前在線下購買過產品的線上會員,可以可以聯結兩個字段:會員電話=會員電話,線下購買日期早於線上購買日期,如下:

另外,我們剛才上面說的,一些特別的數據連接方式,就會用到這種不等於判斷。 在下面的這個分析需求中,我們預設使用左連接,然後聯結字段設置為"表A的訂單ID不等於表B的訂單ID"即可。

2、數據連接是在行級別的聯結,而數據混合是在視圖級別的聯結。 簡單的說,構建視圖前用join,構建視圖後用blend。
3、數據混合中經常使用輔助數據源的維度欄位怎麼辦? 創建主組,可以加入主數據源。 (有待補充)
Apr 26, 2019 G152
Apr 27, 2019
Apr 30, 2019 增加cross database join
Jun 27, 2019 update
Jul 17, 2019 增加第四部分判斷邏輯
Jul 20, 2019 增加數據混合部分