Operátor partition

Operátor oddílu rozdělí záznamy ze své vstupní tabulky do více podtables podle hodnot v klíčovém sloupci. Operátor spustí poddotaz pro každou podtabulku 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 jenom na podmnožinu řádků, která patří do stejného klíče oddílu, a ne dotazovat se na celou datovou sadu. Tyto poddotazy můžou zahrnovat agregační funkce, funkce oken, prvních 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 hodnotami oddílů klíčů.
  • Shuffle – používá se s implicitními zdroji s miliony hodnot oddílů klíčů.
  • Starší – používá se s implicitním nebo explicitním zdrojem pro 64 nebo méně hodnot oddílů klíče.

Syntax

T|partition [ hint.strategy=Strategie ] [ Tipy ] byTransformace sloupcůSubQuery()

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

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

Parametry

Název Typ Vyžadováno Popis
T string ✔️ Vstupní tabulkový zdroj.
Strategie string Hodnota legacy, shufflenebo native. Tato nápověda definuje strategii provádění operátoru oddílu.

Pokud není zadaná žádná strategie, použije se legacy strategie. Další informace najdete 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 ✔️ Výraz tabulkové transformace. Zdrojem jsou implicitně podtables vytvořené dělením záznamů T. Každá podtabulka je na hodnotě Column stejnorodá.

Výraz musí poskytovat 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ší verzi strategie. Poddotaz může odkazovat pouze na klíčový sloupec Column z T. Pokud chcete odkazovat na sloupec, použijte syntaxi toscalar(Sloupec).

Výraz musí poskytovat pouze jeden tabulkový výsledek a neměl by obsahovat jiné typy příkazů, jako let jsou příkazy.
Tipy string Žádný nebo více parametrů oddělených mezerami ve tvaru: HintName=Value , které řídí chování operátoru. Projděte si podporované tipy pro jednotlivé typy strategie.

Podporované rady

Název nápovědy Typ Strategie Description
hint.shufflekey string shuffle Klíč oddílu použitý ke spuštění operátoru oddílu shuffle se strategií.
hint.materialized bool Starší Pokud je nastavená hodnota true, materializuje zdroj operátoru partition . Výchozí hodnota je false.
hint.concurrency int Starší Určuje, kolik oddílů se má spustit paralelně. Výchozí hodnota je 16.
hint.spread int Starší Určuje způsob distribuce oddílů mezi uzly clusteru. Výchozí hodnota je 1.

Pokud například existuje N oddílů a tip na rozložení je nastavený na P, pak se N oddílů budou zpracovávat různými uzly clusteru P paralelně nebo sekvenčně v závislosti na nápovědě ke 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é a starší.

Poznámka

Rozdíl mezi native strategiemi a shuffle umožňuje volajícímu označit kardinalitu a strategii provádění poddotazů. 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 v případě, že 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ů dílčí tabulky. V poddotazu je možné použít pouze některé podporované operátory . Počet oddílů není nijak omezen.

Pokud chcete tuto strategii použít, zadejte hint.strategy=native.

Strategie náhodného přehrávání

Tato strategie by se měla použít v případě, že 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ů dílčí tabulky. V poddotazu je možné použít pouze některé podporované operátory . Počet oddílů není nijak omezen.

Pokud chcete tuto strategii použít, 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 strategie náhodného prohazování

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

Poznámka

  • Operátory, které odkazují na jiný zdroj tabulky než oddíly dílčí tabulky, nejsou kompatibilní se strategiemi native a shuffle . Například join, union, externaldata a evaluate (moduly plug-in). V takových scénářích se uchylujte ke starší strategii.
  • Operátor forku není podporovaný pro žádný typ strategie, protože poddotaz musí vrátit jeden tabulkový výsledek.

Starší verze strategie

Z historických důvodů legacy je strategie výchozí strategií. Doporučujeme ale 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á, protože podporuje zahrnutí tabulkového zdroje do poddotazu. V takových případech může poddotaz odkazovat pouze na klíčový sloupec Column 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, je zdroj implicitní a je založený na oddílech dílčí tabulky.

Pokud chcete tuto strategii použít, zadejte hint.strategy=legacy nebo vyněněte jakékoli jiné označení strategie.

Poznámka

Pokud sloupec oddílu Column 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šší napsat dotaz pomocí operátoru partition než operátor .top-nested Následující dotaz spustí výpočet poddotaz summarize a top pro každý z nich State : 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 Stav Událost Zranění
Krupobití WYOMING 108 0
Silný vítr WYOMING 81 5
Zimní bouře WYOMING 72 0
Těžký sníh WASHINGTON 82 0
Silný vítr WASHINGTON 58 13
Wildfire WASHINGTON 29 0
Bouřkový vítr WEST VIRGINIA 180 1
Krupobití WEST VIRGINIA 103 0
Zimní počasí WEST VIRGINIA 88 0
Bouřkový vítr WISCONSIN 416 1
Zimní bouře WISCONSIN 310 0
Krupobití WISCONSIN 303 1

Nativní strategie

Následující dotaz vrátí první 2 EventType hodnoty podle TotalInjuries pro každou 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í 1
Bouřkový vítr 1
Nadměrné teplo 0
Silný vítr 13
Lightning 5
Silný vítr 5
Lavina 3

Strategie náhodného shuffle

Následující dotaz vrátí 3 DamagedProperty nejvyšší 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 z StormEvents , které mají InjuriesIndirect == 1.
  • Když x == 2dotaz vrátí všechny řádky z StormEvents , které 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 "název" každému datovému oddílu a pak tento název znovu použít v rámci poddotaz. 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))
)