結合和最佳化資料
組織通常會從許多來源定型不同類型的資訊。 此資訊會儲存在大量的資料表中。 有時候,您可能需要根據資料表之間的邏輯關聯性來聯結資料表,以進行更深入的分析或報告。 在零售公司案例中,您會使用數據表來取得客戶、產品和銷售資訊。
在本課程模組中,您將瞭解在 Kusto 查詢中結合數據的各種方式,為您的小組成員提供他們增加產品意識和拓展銷售所需的資訊。
了解您的資料
開始撰寫結合您資料表資訊的查詢之前,您必須了解您的資料。 當您使用 Kusto 查詢時,您想要將資料表視為廣泛屬於兩個類別之一:
- 事實資料表:其記錄為不可變事實的資料表,例如零售公司案例中的 SalesFact 資料表。 在這些資料表中,記錄會以串流方式或大型區塊逐漸附加。 記錄會保留在數據表中,直到移除記錄,且永遠不會更新。
- 維度資料表:其記錄為可變維度的資料表,例如零售公司案例中的 Customers 和 Products 資料表。 這些資料表保存參考資料,例如從實體識別碼至其屬性的查閱資料表。 維度資料表不會定期更新新資料。
在我們的零售公司案例中,您可以使用維度數據表來擴充 SalesFact 數據表,並提供更多選項來篩選查詢的數據。
您也想要瞭解您正在使用的資料量及其結構,或架構(資料行名稱和類型)。 您可以執行下列查詢來取得該資訊,方法是將 TABLE_NAME 取代為您正在檢查的資料表名稱:
若要取得資料表中記錄的數目,請使用
count
運算子:TABLE_NAME | count
若要取得資料表的結構描述,請使用
getschema
運算子:TABLE_NAME | getschema
在零售公司案例中的事實和維度數據表上執行這些查詢,可提供如下列範例所示的資訊:
Table | 記錄 | 結構描述 |
---|---|---|
SalesFact | 2,832,193 | - SalesAmount (real) - TotalCost (real) - DateKey (datetime) - ProductKey (long) - CustomerKey (long) |
客戶 | 18,484 | - CityName (string) - CompanyName (string) - ContinentName (string) - CustomerKey (long) - Education (string) - FirstName (string) - Gender (string) - LastName (string) - MaritalStatus (string) - Occupation (string) - RegionCountryName (string) - StateProvinceName (string) |
產品 | 2,517 | - ProductName (string) - Manufacturer (string) - ColorName (string) - ClassName (string) - ProductCategoryName (string) - ProductSubcategoryName (string) - ProductKey (long) |
在數據表中,我們反白顯示用來在數據表之間合併記錄的唯一標識符 CustomerKey 和 ProductKey 。
了解多資料表查詢
分析數據之後,您必須瞭解如何結合數據表以提供您需要的資訊。 Kusto 查詢提供數個運算子,可讓您用來合併多個資料表中的資料,包括 lookup
、join
和 union
運算子。
join
運算子透過比對每個資料表中指定資料行的值,來合併兩個資料表的資料列。 產生的資料表取決於您使用的聯結種類。 例如,如果您使用 內部聯結,數據表的數據行與左數據表相同(有時稱為 外部數據表),加上右數據表中的數據行(有時稱為 內部數據表)。 在下一節中,您將深入了解聯結類型。 為獲得最佳效能,如果某個資料表勢必會小於另一個資料表,請將其做為 join
運算子的左側。
lookup
運算子是 join
運算子的特殊實作,可將事實資料表透過維度資料表中的資料擴充的查詢效能最佳化。 其會使用在維度資料表中查閱的值來擴充事實資料表。 為獲得最佳效能,系統預設會假設左資料表是較大的 (事實) 資料表,而右資料表是較小的 (維度) 資料表。 此假設與運算子所使用的 join
假設完全相反。
union
運算子會傳回兩個或多個資料表中的所有資料列。 當您想要結合多個資料表的資料時,這會非常有用。
materialize()
函式會在查詢執行內快取結果,以便後續在查詢中重複使用。 就像擷取子查詢結果的快照集,並在查詢內多次使用。 此函式對於優化結果案例的查詢很有用:
- 計算成本很高
- 不具決定性
不久,您將深入瞭解各種數據表合併運算元和函 materialize()
式,以及如何使用這些運算元。
聯結種類
有許多不同種類的聯結可以執行,這些聯結會影響結果資料表中的結構描述和資料列。 下表顯示 Kusto 查詢語言以及所傳回結構描述和資料列所支援的聯結種類:
聯結種類 | 描述 | 範例說明 |
---|---|---|
innerunique (預設值) |
內部聯結與左側重複資料刪除 結構描述:這兩個資料表中的所有資料行,包括相符的索引鍵 資料列:左資料表中所有重復資料刪除的資料列都符合右資料表的資料列 |
|
inner |
標準內部聯結 結構描述:這兩個資料表中的所有資料行,包括相符的索引鍵 資料列:僅限兩個資料表中相符的資料列 |
|
leftouter |
左方外部聯結 結構描述:這兩個資料表中的所有資料行,包括相符的索引鍵 資料列:左資料表中的所有記錄,而且只包含右資料表中相符的資料列 |
|
rightouter |
右方外部聯結 結構描述:這兩個資料表中的所有資料行,包括相符的索引鍵 資料列:右資料表中的所有記錄,而且只包含左資料表中相符的資料列 |
|
fullouter |
完整外部聯結 結構描述:這兩個資料表中的所有資料行,包括相符的索引鍵 資料列:兩個資料表中的所有記錄,其中不相符的儲存格填入了 null |
|
leftsemi |
左方半聯結 結構描述:左資料表中的所有資料行 資料列:左資料表中的所有記錄符合右資料表的記錄 |
|
leftanti 、 、 anti leftantisemi |
左方反向聯結和半變異 結構描述:左資料表中的所有資料行 資料列:左資料表中的所有記錄不符合右資料表的記錄 |
|
rightsemi |
右方半聯結 結構描述:右資料表中的所有資料行 資料列:右資料表中的所有記錄符合左資料表的記錄 |
|
rightanti , rightantisemi |
右方反向聯結和半變異 結構描述:右資料表中的所有資料行 資料列:右資料表中的所有記錄不符合左資料表的記錄 |
請注意,預設聯結種類為 innerunique
,而且不需要指定。 不過,為清楚起見,最佳做法是一律明確指定聯結種類。
當您完成本課程模組時,您也會瞭解 arg_min()
和 arg_max()
聚合函數、 as
運算符做為語句的替代方案 let
,以及 startofmonth()
可協助依月份分組數據的函式。