partition 運算子
數據分割運算子會根據索引鍵數據行中的值,將其輸入數據表的記錄分割成多個子數據表。 運算子會在每個子數據表上執行子查詢,併產生單一輸出數據表,該數據表是所有子查詢結果的聯集。
當您只需要對屬於相同數據分割索引鍵的數據列子集執行子查詢,而不是查詢整個數據集時,這個運算子就很有用。 這些子查詢可能包括聚合函數、視窗函數、前 N 個和其他查詢。
Partition 運算子支援數個子查詢作業策略:
Syntax
T|
partition
[ 策略 ] [ hint.strategy=
提示 ] by
資料行(
轉換SubQuery)
T|
partition
[ ] [ hint.strategy=legacy
Hints ] by
Column{
SubQueryWithSource}
深入瞭解 語法慣例。
參數
名稱 | 類型 | 必要 | Description |
---|---|---|---|
T | string |
✔️ | 輸入表格式來源。 |
策略 | string |
、 shuffle 或native 值legacy 。 此提示會定義數據分割運算符的執行策略。如果未指定任何策略,則會 legacy 使用策略。 如需詳細資訊,請參閱 策略。 |
|
資料行 | string |
✔️ | T 中數據行的名稱,其值決定如何分割輸入表格式來源。 |
TransformationSubQuery | string |
✔️ | 表格式轉換表達式。 來源是透過分割 T 記錄所產生的子數據表。每個子數據表在 Column 的值上都是同質的。 表達式只能提供一個表格式結果,而且不應該有其他類型的語句,例如 let 語句。 |
SubQueryWithSource | string |
✔️ | 表格式表達式,包含自己的表格式來源,例如數據表參考。 此語法僅支援 舊版策略。 子查詢只能從 T 參考索引鍵數據行 Column。若要參考數據行,請使用 Column 語法) toscalar( 。表達式只能提供一個表格式結果,而且不應該有其他類型的語句,例如 let 語句。 |
提示 | string |
以下列形式分隔零個或多個空格分隔參數: HintName= Value ,可控制運算符的行為。 請參閱每個策略類型的 支援提示 。 |
支援的提示
提示名稱 | 類型 | 策略 | 描述 |
---|---|---|---|
hint.shufflekey |
string |
隨機播放 | 用來搭配策略執行數據分割運算符的數據 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
- project-away
- project-keep
- project-rename
- project-reorder
- reduce
- 樣品
- sample-distinct
- scan
- search
- serialize
- sort
- summarize
- take
- top
- top-hitters
- top-nested
- where
注意
舊版策略
基於歷史理由,策略 legacy
是預設策略。 不過,我們建議偏好 原生 或 隨機 策略,因為 legacy
方法限製為64個數據分割,而且效率較低。
在某些情況下, legacy
策略可能會因為其支援在子查詢中包含表格式來源而需要。 在這種情況下,子查詢只能從輸入表格式來源 T 參考索引鍵數據行 Column。若要參考數據行,請使用語法 toscalar(
Column)
。
如果子查詢是沒有表格式來源的表格式轉換,則來源是隱含的,而且是以子數據表分割為基礎。
若要使用此策略,請指定 hint.strategy=legacy
或省略任何其他策略指示。
注意
如果數據分割數據行 Column 包含超過 64 個相異值,就會發生錯誤。
範例
尋找頂端值
在某些情況下,使用運算符撰寫查詢比使用 partition
top-nested
運算子更為高效能且更容易。 下列查詢會執行子查詢計算summarize
,top
並針對每個State
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 | 州 | 事件 | 損傷 |
---|---|---|---|
Hail | WYOMING | 108 | 0 |
強風 | WYOMING | 81 | 5 |
暴風雪 | WYOMING | 72 | 0 |
大雪 | WASHINGTON | 82 | 0 |
強風 | WASHINGTON | 58 | 13 |
野火 | WASHINGTON | 29 | 0 |
Thunderstorm Wind | 西維吉尼亞 | 180 | 1 |
Hail | 西維吉尼亞 | 103 | 0 |
冬季天氣 | 西維吉尼亞 | 88 | 0 |
Thunderstorm Wind | WISCONSIN | 416 | 1 |
暴風雪 | WISCONSIN | 310 | 0 |
Hail | WISCONSIN | 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 |
Hail | 1 |
Thunderstorm Wind | 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
輸出
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
輸出
Count |
---|
113 |
分割區參考
下列範例將示範如何使用 as 運算子,將「名稱」提供給每個資料分割區,然後在子查詢中重複使用該名稱。 這個方法只與 legacy
策略相關。
T
| partition by Dim
(
as Partition
| extend MetricPct = Metric * 100.0 / toscalar(Partition | summarize sum(Metric))
)
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應