partition-operatorn

Partitionsoperatorn partitioner posterna i indatatabellen i flera undertabeller enligt värden i en nyckelkolumn. Operatorn kör en underfråga i varje undertabell och skapar en enda utdatatabell som är en union av resultaten för alla underfrågor.

Den här operatorn är användbar när du bara behöver utföra en underfråga på en delmängd av rader som tillhör samma partitionsnyckel och inte fråga hela datauppsättningen. Dessa underfrågor kan innehålla aggregeringsfunktioner, fönsterfunktioner, översta N och andra.

Partitionsoperatorn stöder flera strategier för underfrågor:

  • Intern – använd med en implicit datakälla med tusentals nyckelpartitionsvärden.
  • Shuffle – använd med en implicit källa med miljontals nyckelpartitionsvärden.
  • Äldre – använd med en implicit eller explicit källa för 64 eller färre nyckelpartitionsvärden.

Syntax

T|partition [ hint.strategy=Strategi ] [ Tips ] byKolumntransformeringarSubQuery()

T|partition [ hint.strategy=legacy ] [ tips ] bykolumn{subquerywithsource}

Läs mer om syntaxkonventioner.

Parametrar

Namn Typ Obligatorisk Beskrivning
T string ✔️ Tabellkällan för indata.
Strategi string Värdet legacy, shuffleeller native. Det här tipset definierar partitionsoperatorns körningsstrategi.

Om ingen strategi anges legacy används strategin. Mer information finns i Strategier.
Kolumn string ✔️ Namnet på en kolumn i T vars värden bestämmer hur indatatabellkällan ska partitioneras.
TransformationSubQuery string ✔️ Ett transformeringsuttryck i tabellform. Källan är implicit de undertabeller som skapas genom partitionering av posterna i T. Varje undertabell är homogen på värdet för Kolumn.

Uttrycket får bara ge ett tabellresultat och får inte ha andra typer av -instruktioner, till exempel let -instruktioner.
SubQueryWithSource string ✔️ Ett tabelluttryck som innehåller en egen tabellkälla, till exempel en tabellreferens. Den här syntaxen stöds bara med den äldre strategin. Underfrågan kan bara referera till nyckelkolumnen, Kolumn, från T. Om du vill referera till kolumnen använder du syntaxkolumnen)toscalar(.

Uttrycket får bara ge ett tabellresultat och får inte ha andra typer av -instruktioner, till exempel let -instruktioner.
Tips string Noll eller fler blankstegsavgränsade parametrar i form av: HintName-värde= som styr operatorns beteende. Se tips som stöds per strategityp.

Tips som stöds

Tipsnamn Typ Strategi Description
hint.shufflekey string shuffle Partitionsnyckeln som används för att köra partitionsoperatorn med shuffle strategin.
hint.materialized bool Legacy Om värdet är true, kommer att materialisera operatorns partition källa. Standardvärdet är false.
hint.concurrency int Legacy Avgör hur många partitioner som ska köras parallellt. Standardvärdet är 16.
hint.spread int Legacy Avgör hur partitionerna ska distribueras mellan klusternoder. Standardvärdet är 1.

Om det till exempel finns N partitioner och spridningstipset är inställt på P, bearbetas N-partitionerna av P olika klusternoder lika parallellt/sekventiellt beroende på samtidighetstipset.

Returer

Operatorn returnerar en union av resultaten från de enskilda underfrågorna.

Strategier

Partitionsoperatorn stöder flera strategier för underfrågor: intern, shuffle och äldre.

Anteckning

Skillnaden mellan strategierna native och shuffle gör att anroparen kan ange underfrågans kardinalitet och körningsstrategi. Det här valet kan påverka hur lång tid underfrågan tar att slutföra men ändrar inte slutresultatet.

Intern strategi

Den här strategin bör tillämpas när antalet distinkta värden för partitionsnyckeln inte är stort, ungefär i tusental.

Underfrågan måste vara en tabelltransformering som inte anger någon tabellkälla. Källan är implicit och tilldelas enligt undertabellpartitionerna. Endast vissa operatorer som stöds kan användas i underfrågan. Det finns ingen begränsning för antalet partitioner.

Om du vill använda den här strategin anger du hint.strategy=native.

Shuffle-strategi

Den här strategin bör tillämpas när antalet distinkta värden för partitionsnyckeln är stort, i miljoner.

Underfrågan måste vara en tabelltransformering som inte anger någon tabellkälla. Källan är implicit och tilldelas enligt undertabellpartitionerna. Endast vissa operatorer som stöds kan användas i underfrågan. Det finns ingen begränsning för antalet partitioner.

Om du vill använda den här strategin anger du hint.strategy=shuffle. Mer information om shuffle-strategi och prestanda finns i shuffle-fråga.

Operatorer som stöds för de interna strategierna och shuffle-strategierna

Följande lista över operatorer kan användas i underfrågor med interna strategier eller shuffle-strategier:

Anteckning

  • Operatorer som refererar till en annan tabellkälla än undertabellpartitionerna är inte kompatibla med strategierna native och shuffle . Till exempel join, union, externaldata och evaluate (plugins). För sådana scenarier använder du den äldre strategin.
  • Förgreningsoperatorn stöds inte för någon strategityp, eftersom underfrågan måste returnera ett enda tabellresultat.

Äldre strategi

Av historiska skäl legacy är strategin standardstrategin. Vi rekommenderar dock att du föredrar de interna strategierna eller shuffle-strategiernalegacy, eftersom metoden är begränsad till 64 partitioner och är mindre effektiv.

I vissa scenarier legacy kan strategin vara nödvändig på grund av dess stöd för att inkludera en tabellkälla i underfrågan. I sådana fall kan underfrågan bara referera till nyckelkolumnen, Kolumn, från indatatabellkällan, T. Om du vill referera till kolumnen använder du syntaxkolumnen)toscalar(.

Om underfrågan är en tabelltransformering utan tabellkälla är källan implicit och baseras på undertabellpartitionerna.

Om du vill använda den här strategin anger hint.strategy=legacy eller utelämnar du någon annan strategiindikator.

Anteckning

Ett fel uppstår om partitionskolumnen Kolumn innehåller fler än 64 distinkta värden.

Exempel

Hitta de högsta värdena

I vissa fall är det mer högpresterande och enklare att skriva en fråga med operatorn partition än att använda operatorn top-nested . Följande fråga kör en underfråga som beräknar summarize och top för varje State börjar med W: "WYOMING", "WASHINGTON", "WEST VIRGINIA" och "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 
    ) 

Resultat

Eventtype Tillstånd Händelser Skador
Hagel WYOMING 108 0
Hög vind WYOMING 81 5
Vinterstorm WYOMING 72 0
Tung snö WASHINGTON 82 0
Hög vind WASHINGTON 58 13
Wildfire WASHINGTON 29 0
Åska vind West Virginia 180 1
Hagel West Virginia 103 0
Vinterväder West Virginia 88 0
Åska vind WISCONSIN 416 1
Vinterstorm WISCONSIN 310 0
Hagel WISCONSIN 303 1

Intern strategi

Följande fråga returnerar de 2 EventType främsta värdena TotalInjuries efter för varje State som börjar med "W":

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

Resultat

Eventtype TotalInjueries
Tornado 4
Hagel 1
Åska vind 1
Överdriven värme 0
Hög vind 13
Lightning 5
Hög vind 5
Lavin 3

Shuffle-strategi

Följande fråga returnerar de 3 DamagedProperty främsta värdena foreach EpisodeId och kolumnerna EpisodeId och State.

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

Resultat

Antal
22345

Äldre strategi med explicit källa

Följande fråga kör två underfrågor:

  • När x == 1returnerar frågan alla rader från StormEvents som har InjuriesIndirect == 1.
  • När x == 2returnerar frågan alla rader från StormEvents som har InjuriesIndirect == 2.

Slutresultatet är en union av dessa två underfrågor.

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

Resultat

Antal
113

Partitionsreferens

I följande exempel visas hur du använder operatorn som för att ge ett "namn" till varje datapartition och sedan återanvända det namnet i underfrågan. Den här metoden är endast relevant för legacy strategin.

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