Sdílet prostřednictvím


Operátor partition

Operátor oddílu rozdělí záznamy své vstupní tabulky do více podtables podle hodnot ve sloupci klíče. Operátor spustí poddotaz na každé podtable a vytvoří jednu výstupní tabulku, která je sjednocením výsledků všech poddotazů.

Tento operátor je užitečný, když potřebujete provést poddotaz pouze na podmnožinu řádků, které patří do stejného klíče oddílu, a ne dotazovat se na celou datovou sadu. Mezi tyto poddotazy můžou patřit agregační funkce, funkce oken, horní N a další.

Operátor oddílu podporuje několik strategií operace poddotazů:

  • Nativní – používá se s implicitními zdroji dat s tisíci hodnot oddílů klíčů.
  • Náhodné prohazování – používá se s implicitní zdrojem s miliony hodnot oddílů klíčů.
  • Starší verze – používá se s implicitním nebo explicitním zdrojem pro 64 nebo méně hodnot oddílů klíče.

Syntaxe

T partition | [ hint.strategy=Strategie ] [ Rady ] by Transformace sloupcůSubQuery ( )

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

Přečtěte si další informace o konvencích syntaxe.

Parametry

Název Type Požadováno Popis
T string ✔️ Vstupní tabulkový zdroj.
Strategie string Hodnota legacy, shufflenebo native. Tento tip definuje strategii provádění operátoru oddílu.

Pokud není zadána žádná strategie, použije se legacy strategie. Další informace naleznete v tématu Strategie.
Sloupec string ✔️ Název sloupce v T , jehož hodnoty určují způsob rozdělení vstupního tabulkového zdroje.
TransformationSubQuery string ✔️ Tabulkový transformační výraz. Zdroj je implicitně podřízené tabulky vytvořené rozdělením záznamů T. Každá podtable je homogenní pro hodnotu Column.

Výraz musí obsahovat pouze jeden tabulkový výsledek a neměl by obsahovat jiné typy příkazů, jako let jsou příkazy.
SubQueryWithSource string ✔️ Tabulkový výraz, který obsahuje vlastní tabulkový zdroj, například odkaz na tabulku. Tato syntaxe je podporována pouze ve starší strategii. Poddotaz může odkazovat pouze na klíčový sloupec Sloupec z T. Pokud chcete odkazovat na sloupec, použijte syntaxi toscalar(Sloupec).

Výraz musí obsahovat pouze jeden tabulkový výsledek a neměl by obsahovat jiné typy příkazů, jako let jsou příkazy.
Rady string Nula nebo více parametrů oddělených mezerami ve formě: HintName = Hodnota, která řídí chování operátoru. Podívejte se na podporované rady pro jednotlivé typy strategie.

Podporované rady

Název nápovědy Typ Strategie Popis
hint.shufflekey string zamíchat Klíč oddílu použitý ke spuštění operátoru oddílu shuffle se strategií.
hint.materialized bool dědictví Pokud je nastavena hodnota true, materializuje zdroj operátoru partition . Výchozí hodnota je false.
hint.concurrency int dědictví Určuje, kolik oddílů se má paralelně spouštět. Výchozí hodnota je 16.
hint.spread int dědictví Určuje, jak distribuovat oddíly mezi uzly clusteru. Výchozí hodnota je 1.

Pokud jsou například oddíly N a tip šíření je nastavený na P, pak N oddíly budou zpracovány různými uzly clusteru P rovnoměrně paralelně nebo postupně v závislosti na nápovědě souběžnosti.

Návraty

Operátor vrátí sjednocení výsledků jednotlivých poddotazů.

Strategie

Operátor oddílu podporuje několik strategií operace poddotazů: nativní, náhodné prohazování a starší verze.

Poznámka:

Rozdíl mezi strategiemi native shuffle umožňuje volajícímu označit kardinalitu a strategii provádění poddotazu. Tato volba může ovlivnit, jak dlouho trvá dokončení poddotazu, ale nezmění konečný výsledek.

Nativní strategie

Tato strategie by se měla použít, když počet jedinečných hodnot klíče oddílu není velký, zhruba v tisících.

Poddotaz musí být tabulková transformace, která neurčí tabulkový zdroj. Zdroj je implicitní a je přiřazen podle oddílů podtable. V poddotazu lze použít pouze některé podporované operátory . Počet oddílů není nijak omezen.

Chcete-li použít tuto strategii, zadejte hint.strategy=native.

Strategie náhodného prohazu

Tato strategie by se měla použít, pokud je počet jedinečných hodnot klíče oddílu velký v milionech.

Poddotaz musí být tabulková transformace, která neurčí tabulkový zdroj. Zdroj je implicitní a je přiřazen podle oddílů podtable. V poddotazu lze použít pouze některé podporované operátory . Počet oddílů není nijak omezen.

Chcete-li použít tuto strategii, zadejte hint.strategy=shuffle. Další informace o strategii náhodného prohazování a výkonu najdete v tématu dotaz náhodného prohazování.

Podporované operátory pro nativní strategie a prohazování

Následující seznam operátorů lze použít v poddotazech s nativními strategiemi nebo prohazování:

Poznámka:

  • Operátory, které odkazují na jiný zdroj tabulky než oddíly podtable, nejsou kompatibilní se strategieminative.shuffle Například spojení, sjednocení, externí data a vyhodnocení (moduly plug-in). V takových scénářích se uchýlíte ke starší strategii.
  • Operátor forku není podporován pro žádný typ strategie, protože poddotaz musí vrátit jeden tabulkový výsledek.

Strategie starší verze

Z historických důvodů legacy je strategie výchozí strategií. Doporučujeme však upřednostňovat nativní strategie nebo strategie náhodného prohazování , protože legacy přístup je omezený na 64 oddílů a je méně efektivní.

V některých scénářích legacy může být strategie nezbytná kvůli podpoře zahrnutí tabulkového zdroje do poddotazů. V takových případech může poddotaz odkazovat pouze na klíčový sloupec Sloupec ze vstupního tabulkového zdroje T. Pokud chcete odkazovat na sloupec, použijte syntaxi toscalar(Sloupec).

Pokud je poddotaz tabulkovou transformací bez tabulkového zdroje, zdroj je implicitní a je založený na oddílech podtable.

Pokud chcete tuto strategii použít, určete hint.strategy=legacy nebo vynět jakoukoli jinou indikaci strategie.

Poznámka:

Pokud sloupec oddílu Sloupec obsahuje více než 64 jedinečných hodnot, dojde k chybě.

Příklady

Vyhledání nejvyšších hodnot

V některých případech je výkonnější a jednodušší psát dotaz pomocí operátoru partition než pomocí operátoru top-nested . Následující dotaz spustí výpočet summarize poddotazů a top pro každý z nich State začíná výrazem W:"WYOMING", "WASHINGTON", "WEST VIRGINIA" a "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 
    ) 

Výstup

Typ události State Události Zranění
Krupobití WYOMING 108 0
Velký vítr WYOMING 81 5
Zimní bouře WYOMING 72 0
Silné sněžení WASHINGTONSKÝ 82 0
Velký vítr WASHINGTONSKÝ 58 13
Ničivý požár WASHINGTONSKÝ 29 0
Větrná bouře ZÁPADNÍ VIRGINIE 180 0
Krupobití ZÁPADNÍ VIRGINIE 103 0
Počasí v zimě ZÁPADNÍ VIRGINIE 88 0
Větrná bouře WISCONSIN 416 0
Zimní bouře WISCONSIN 310 0
Krupobití WISCONSIN 303 0

Nativní strategie

Následující dotaz vrátí prvních 2 EventType hodnot TotalInjuries pro každý State , který začíná na "W":

StormEvents
| where State startswith 'W'
| partition hint.strategy = native by State
    (
    summarize TotalInjueries = sum(InjuriesDirect) by EventType
    | top 2 by TotalInjueries
    )

Výstup

Typ události TotalInjueries
Tornádo 4
Krupobití 0
Větrná bouře 0
Nadměrné teplo 0
Velký vítr 13
Lightning 5
Velký vítr 5
Lavina 3

Strategie náhodného prohazu

Následující dotaz vrátí prvních 3 DamagedProperty hodnoty foreach EpisodeId a sloupce EpisodeId a State.

StormEvents
| partition hint.strategy=shuffle by EpisodeId
    (
    top 3 by DamageProperty
    | project EpisodeId, State, DamageProperty
    )
| count

Výstup

Počet
22345

Starší strategie s explicitním zdrojem

Následující dotaz spustí dva poddotazy:

  • Když x == 1dotaz vrátí všechny řádky, které StormEvents mají InjuriesIndirect == 1.
  • Když x == 2dotaz vrátí všechny řádky, které StormEvents mají InjuriesIndirect == 2.

Konečným výsledkem je sjednocení těchto dvou poddotazů.

range x from 1 to 2 step 1
| partition hint.strategy=legacy by x {StormEvents | where x == InjuriesIndirect}
| count 

Výstup

Počet
113

Referenční informace k oddílům

Následující příklad ukazuje, jak pomocí operátoru as dát "name" každému datovému oddílu a pak tento název znovu použít v poddotazu. Tento přístup je relevantní pouze pro strategii legacy .

T
| partition by Dim
(
    as Partition
    | extend MetricPct = Metric * 100.0 / toscalar(Partition | summarize sum(Metric))
)