共用方式為


partition 運算符

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

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

資料分割運算子支援數種子查詢作業策略:

  • 原生 - 搭配具有數千個索引鍵分割值的隱含數據源使用。
  • 隨機顯示 - 搭配具有數百萬個索引鍵分割值的隱含來源使用。
  • 舊版 - 搭配 64 或更少索引鍵分割值的隱含或明確來源使用。

語法

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

T partition | [ ] [ hint.strategy=legacy Hints ] by Column { SubQueryWithSource }

深入瞭解 語法慣例

參數

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

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

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

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

注意

舊版策略

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

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

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

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

注意

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

範例

尋找最上層值

在某些情況下,使用運算符撰寫查詢比使用 partition top-nested 運算子更為高效能且更容易。 下列查詢會針對每個State查詢執行子查詢,summarizetop開頭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 值,以及 資料行 EpisodeIdState

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