partition 運算子
適用於:✅Microsoft網狀架構✅Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel
數據分割運算子會根據索引鍵數據行中的值,將其輸入數據表的記錄分割成多個子數據表。 運算子會在每個子數據表上執行子查詢,併產生單一輸出數據表,該數據表是所有子查詢結果的聯集。
當您只需要對屬於相同數據分割索引鍵的數據列子集執行子查詢,而不是查詢整個數據集時,這個運算子就很有用。 這些子查詢可能包括聚合函數、視窗函式、前 N 名和其他專案。
資料分割運算子支援數種子查詢作業策略:
語法
T |
partition
[ 策略 ] [ hint.strategy=
提示 ] by
資料行 (
轉換SubQuery )
T partition
|
[ ] [ hint.strategy=legacy
Hints ] by
Column {
SubQueryWithSource }
深入瞭解 語法慣例。
參數
姓名 | 類型 | 必要 | 描述 |
---|---|---|---|
T | string |
✔️ | 輸入表格式來源。 |
策略 | string |
值 legacy 、 shuffle 或 native 。 此提示會定義數據分割運算符的執行策略。如果未指定任何策略,則會 legacy 使用策略。 如需詳細資訊,請參閱 策略。 |
|
資料行 | string |
✔️ | T 中的數據行名稱,其值決定如何分割輸入表格式來源。 |
TransformationSubQuery | string |
✔️ | 表格式轉換表達式。 來源隱含地是分割 T 記錄所產生的子數據表。每個子數據表在 Column 的值上都是同質的。 表達式只能提供一個表格式結果,而且不應該有其他類型的語句,例如 let 語句。 |
SubQueryWithSource | string |
✔️ | 表格式表達式,其中包含自己的表格式來源,例如數據表參考。 只有舊版策略才支援此語法。 子查詢只能從 T 參考索引鍵數據行 Column。若要參考數據行,請使用語法 toscalar( Column) 。表達式只能提供一個表格式結果,而且不應該有其他類型的語句,例如 let 語句。 |
提示 | string |
零或多個以空格分隔的參數,格式為:控制運算符行為的 HintName = 值。 請參閱每個策略類型的支援提示。 |
支援的提示
提示名稱 | 類型 | 策略 | 描述 |
---|---|---|---|
hint.shufflekey |
string |
shuffle | 用來使用策略執行數據分割運算符的數據 shuffle 分割索引鍵。 |
hint.materialized |
bool |
遺產 | 如果設定為 true ,則會具體化運算子的來源 partition 。 預設值是 false 。 |
hint.concurrency |
int |
遺產 | 決定要平行執行的分割區數目。 預設值是 16 。 |
hint.spread |
int |
遺產 | 決定如何在叢集節點之間散發分割區。 預設值是 1 。例如,如果有 N 個資料分割且散佈提示設定為 P,則 P 不同的叢集節點會根據並行/循序提示,以相同方式處理 N 個數據分割。 |
傳回
運算符會傳回個別子查詢結果的聯集。
策略
數據分割運算元支持數個子查詢作業策略: 原生、 隨機和 舊版。
注意
和 shuffle
策略之間的差異native
可讓呼叫端指出子查詢的基數和執行策略。 此選項可能會影響子查詢完成所花費的時間,但不會變更最終結果。
原生策略
當分割區索引鍵的相異值數目在數千個左右時,應該套用此策略。
子查詢必須是未指定表格式來源的表格式轉換。 來源是隱含的,而且會根據子數據表分割指派。 子查詢中只能使用特定 支援的運算元 。 分割區數目沒有限制。
若要使用此策略,請指定 hint.strategy=native
。
隨機策略
當分割區索引鍵的相異值數目在數百萬時,應該套用此策略。
子查詢必須是未指定表格式來源的表格式轉換。 來源是隱含的,而且會根據子數據表分割指派。 子查詢中只能使用特定 支援的運算元 。 分割區數目沒有限制。
若要使用此策略,請指定 hint.strategy=shuffle
。 如需隨機策略和效能的詳細資訊,請參閱 隨機查詢。
原生和隨機策略的支持運算符
下列運算子清單可用於具有原生或隨機策略的子查詢:
- 計數
- distinct
- extend
- make-series
- mv-apply
- mv-expand
- parse
- parse-where
- 專案
- project-away
- project-keep
- project-rename
- project-reorder
- reduce
- 樣本
- sample-distinct
- 掃描
- search
- 序列化
- sort
- summarize
- take
- top
- top-hitters
- top-nested
- where
注意
- 參考子數據表數據分割以外的數據表來源的運算子與 和
shuffle
策略不相容native
。 例如,聯結、等位、externaldata 和 evaluate (plugins)。 針對這類案例,請採用 舊版策略。 - 任何 策略類型都不支援分叉 運算符,因為子查詢必須傳回單一表格式結果。
舊版策略
基於歷史原因,策略 legacy
是預設策略。 不過,我們建議使用 原生 或 隨機 策略,因為 legacy
方法限製為64個分割區,而且效率較低。
在某些情況下,策略可能是必要的, legacy
因為它支援在子查詢中包含表格式來源。 在這種情況下,子查詢只能從輸入表格式來源 T 參考索引鍵數據行 Column。若要參考數據行,請使用語法 toscalar(
Column)
。
如果子查詢是不含表格式來源的表格式轉換,則來源是隱含的,而且是以子數據表分割為基礎。
若要使用此策略,請指定 hint.strategy=legacy
或省略任何其他策略指示。
注意
如果數據分割數據行 Column 包含超過 64 個相異值,就會發生錯誤。
範例
尋找最上層值
在某些情況下,使用運算符撰寫查詢比使用 partition
top-nested
運算子更為高效能且更容易。 下列查詢會針對每個State
查詢執行子查詢,summarize
其top
開頭W
為 :“WYOMING”、“WASHINGTON”、“WEST 維吉尼亞州”和 “WISCONSIN”。
StormEvents
| where State startswith 'W'
| partition hint.strategy=native by State
(
summarize Events=count(), Injuries=sum(InjuriesDirect) by EventType, State
| top 3 by Events
)
輸出
EventType | 州/省 | 事件 | 損傷 |
---|---|---|---|
冰雹 | 懷俄明州 | 108 | 0 |
強風 | 懷俄明州 | 81 | 5 |
冬季風暴 | 懷俄明州 | 72 | 0 |
大雪 | 華盛頓州 | 82 | 0 |
強風 | 華盛頓州 | 58 | 13 |
野火 | 華盛頓州 | 29 | 0 |
雷暴風 | 西維吉尼亞州 | 180 | 1 |
冰雹 | 西維吉尼亞州 | 103 | 0 |
冬季天氣 | 西維吉尼亞州 | 88 | 0 |
雷暴風 | 威斯康辛州 | 416 | 1 |
冬季風暴 | 威斯康辛州 | 310 | 0 |
冰雹 | 威斯康辛州 | 303 | 1 |
原生策略
下列查詢會針對開頭為 『W』 的每個 State
,傳回的前 2 EventType
個值TotalInjuries
:
StormEvents
| where State startswith 'W'
| partition hint.strategy = native by State
(
summarize TotalInjueries = sum(InjuriesDirect) by EventType
| top 2 by TotalInjueries
)
輸出
EventType | TotalInjueries |
---|---|
龍捲風 | 4 |
冰雹 | 1 |
雷暴風 | 1 |
過度熱度 | 0 |
強風 | 13 |
Lightning | 5 |
強風 | 5 |
雪崩 | 3 |
隨機策略
下列查詢會傳回前 3 DamagedProperty
個 foreach EpisodeId
值,以及 資料行 EpisodeId
和 State
。
StormEvents
| partition hint.strategy=shuffle by EpisodeId
(
top 3 by DamageProperty
| project EpisodeId, State, DamageProperty
)
| count
輸出
計數 |
---|
22345 |
具有明確來源的舊版策略
下列查詢會執行兩個子查詢:
- 當 時
x == 1
,查詢會從StormEvents
中傳回具有InjuriesIndirect == 1
的所有數據列。 - 當 時
x == 2
,查詢會從StormEvents
中傳回具有InjuriesIndirect == 2
的所有數據列。
最終結果是這兩個子查詢的聯集。
range x from 1 to 2 step 1
| partition hint.strategy=legacy by x {StormEvents | where x == InjuriesIndirect}
| count
輸出
計數 |
---|
113 |
數據分割參考
下列範例示範如何使用 as 運算子 ,為每個數據分割提供「名稱」,然後在子查詢中重複使用該名稱。 此方法僅與 legacy
策略相關。
T
| partition by Dim
(
as Partition
| extend MetricPct = Metric * 100.0 / toscalar(Partition | summarize sum(Metric))
)