partition 運算子

數據分割運算子會根據索引鍵數據行中的值,將其輸入數據表的記錄分割成多個子數據表。 運算子會在每個子數據表上執行子查詢,併產生單一輸出數據表,該數據表是所有子查詢結果的聯集。

當您只需要對屬於相同數據分割索引鍵的數據列子集執行子查詢,而不是查詢整個數據集時,這個運算子就很有用。 這些子查詢可能包括聚合函數、視窗函數、前 N 個和其他查詢。

Partition 運算子支援數個子查詢作業策略:

  • 原生 - 搭配具有數千個索引鍵分割區值的隱含資料來源使用。
  • 隨機 - 搭配具有數百萬個索引鍵分割值的隱含來源使用。
  • Legacy - 搭配 64 個或較少索引鍵分割區值的隱含或明確來源使用。

Syntax

T|partition [ 策略 ] [ hint.strategy=提示 ] by資料行(轉換SubQuery)

T|partition [ ] [ hint.strategy=legacyHints ] byColumn{SubQueryWithSource}

深入瞭解 語法慣例

參數

名稱 類型 必要 Description
T string ✔️ 輸入表格式來源。
策略 string shufflenativelegacy。 此提示會定義數據分割運算符的執行策略。

如果未指定任何策略,則會 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。 如需隨機處理策略和效能的詳細資訊,請參閱 隨機查詢

原生和隨機隨機策略支援的運算符

下列運算子清單可用於具有原生或隨機策略的子查詢:

注意

  • 參考子數據表數據分割以外的數據表來源的運算子與 和 shuffle 策略不相容native。 例如, 聯結聯集externaldata評估 (外掛程式) 。 針對這類案例,請採用 舊版策略
  • 任何策略類型都不支援 分叉 運算符,因為子查詢必須傳回單一表格式結果。

舊版策略

基於歷史理由,策略 legacy 是預設策略。 不過,我們建議偏好 原生隨機 策略,因為 legacy 方法限製為64個數據分割,而且效率較低。

在某些情況下, legacy 策略可能會因為其支援在子查詢中包含表格式來源而需要。 在這種情況下,子查詢只能從輸入表格式來源 T 參考索引鍵數據行 Column。若要參考數據行,請使用語法 toscalar(Column)

如果子查詢是沒有表格式來源的表格式轉換,則來源是隱含的,而且是以子數據表分割為基礎。

若要使用此策略,請指定 hint.strategy=legacy 或省略任何其他策略指示。

注意

如果數據分割數據行 Column 包含超過 64 個相異值,就會發生錯誤。

範例

尋找頂端值

在某些情況下,使用運算符撰寫查詢比使用 partitiontop-nested 運算子更為高效能且更容易。 下列查詢會執行子查詢計算summarizetop並針對每個StateW從 開始的子查詢:“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 值與資料列與資料列EpisodeIdState

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))
)