Condividi tramite


Operatore partition

L'operatore partition partiziona i record della tabella di input in più tabelle secondarie in base ai valori di una colonna chiave. L'operatore esegue una sottoquery in ogni sottotabella e produce una singola tabella di output che rappresenta l'unione dei risultati di tutte le sottoquery.

Questo operatore è utile quando è necessario eseguire una sottoquery solo su un subset di righe appartenenti alla stessa chiave di partizione e non eseguire query sull'intero set di dati. Queste sottoquery possono includere funzioni di aggregazione, funzioni finestra, primi N e altri.

L'operatore partition supporta diverse strategie di operazione di sottoquery:

  • Nativo : usare con un'origine dati implicita con migliaia di valori di partizione chiave.
  • Shuffle : usare con un'origine implicita con milioni di valori di partizione chiave.
  • Legacy: usare con un'origine implicita o esplicita per 64 o meno valori di partizione chiave.

Sintassi

T partition | [ hint.strategy=Strategia ] [ Hint ] by Trasformazione colonnaSubQuery ( )

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

Altre informazioni sulle convenzioni di sintassi.

Parametri

Nome Digita Obbligatorio Descrizione
T string ✔️ Origine tabulare di input.
Strategia string Valore legacy, shuffleo native. Questo hint definisce la strategia di esecuzione dell'operatore di partizione.

Se non viene specificata alcuna strategia, viene usata la legacy strategia. Per altre informazioni, vedere Strategie.
Istogramma string ✔️ Nome di una colonna in T i cui valori determinano come partizionare l'origine tabulare di input.
TransformationSubQuery string ✔️ Espressione di trasformazione tabulare. L'origine è implicitamente le sottotable prodotte partizionando i record di T. Ogni sottotabella è omogenea sul valore di Column.

L'espressione deve fornire un solo risultato tabulare e non deve avere altri tipi di istruzioni, ad esempio let le istruzioni.
SubQueryWithSource string ✔️ Espressione tabulare che include la propria origine tabulare, ad esempio un riferimento a una tabella. Questa sintassi è supportata solo con la strategia legacy. La sottoquery può fare riferimento solo alla colonna chiave, Column, da T. Per fare riferimento alla colonna, utilizzare la sintassi toscalar(Column).

L'espressione deve fornire un solo risultato tabulare e non deve avere altri tipi di istruzioni, ad esempio let le istruzioni.
Hint string Zero o più parametri separati da spazi sotto forma di: HintName = Value che controlla il comportamento dell'operatore. Vedere gli hint supportati per ogni tipo di strategia.

Hint supportati

Nome hint Type Strategia Descrizione
hint.shufflekey string shuffle Chiave di partizione usata per eseguire l'operatore di partizione con la shuffle strategia .
hint.materialized bool Eredità Se impostato su true, materializzerà l'origine dell'operatore partition . Il valore predefinito è false.
hint.concurrency int Eredità Determina il numero di partizioni da eseguire in parallelo. Il valore predefinito è 16.
hint.spread int Eredità Determina come distribuire le partizioni tra i nodi del cluster. Il valore predefinito è 1.

Ad esempio, se sono presenti N partizioni e l'hint spread è impostato su P, le N partizioni verranno elaborate da nodi cluster diversi P in parallelo/sequenziale a seconda dell'hint di concorrenza.

Valori restituiti

L'operatore restituisce un'unione dei risultati delle singole sottoquery.

Strategie

L'operatore partition supporta diverse strategie di operazione di sottoquery: nativa, casuale e legacy.

Nota

La distinzione tra le native strategie e shuffle consente al chiamante di indicare la cardinalità e la strategia di esecuzione della sottoquery. Questa scelta può influire sul tempo necessario per completare la sottoquery, ma non modifica il risultato finale.

Strategia nativa

Questa strategia deve essere applicata quando il numero di valori distinti della chiave di partizione non è grande, approssimativamente nelle migliaia.

La sottoquery deve essere una trasformazione tabulare che non specifica un'origine tabulare. L'origine è implicita e viene assegnata in base alle partizioni sottotable. Nella sottoquery è possibile usare solo determinati operatori supportati. Non esiste alcuna restrizione sul numero di partizioni.

Per usare questa strategia, specificare hint.strategy=native.

Strategia casuale

Questa strategia deve essere applicata quando il numero di valori distinti della chiave di partizione è elevato, in milioni.

La sottoquery deve essere una trasformazione tabulare che non specifica un'origine tabulare. L'origine è implicita e viene assegnata in base alle partizioni sottotable. Nella sottoquery è possibile usare solo determinati operatori supportati. Non esiste alcuna restrizione sul numero di partizioni.

Per usare questa strategia, specificare hint.strategy=shuffle. Per altre informazioni sulla strategia e sulle prestazioni casuali, vedere Query casuali.

Operatori supportati per le strategie native e shuffle

L'elenco di operatori seguente può essere usato nelle sottoquery con le strategie native o shuffle:

Nota

  • Gli operatori che fanno riferimento a un'origine di tabella diversa dalle partizioni sottotabella non sono compatibili con le native strategie e shuffle . Ad esempio, join, unione, externaldata e valutazione (plug-in). Per questi scenari, ricorrere alla strategia legacy.
  • L'operatore fork non è supportato per alcun tipo di strategia, perché la sottoquery deve restituire un singolo risultato tabulare.

Strategia legacy

Per motivi cronologici, la legacy strategia è la strategia predefinita. È tuttavia consigliabile favorire le strategie native o casuali , poiché l'approccio legacy è limitato a 64 partizioni ed è meno efficiente.

In alcuni scenari, la legacy strategia potrebbe essere necessaria a causa del supporto per l'inclusione di un'origine tabulare nella sottoquery. In questi casi, la sottoquery può fare riferimento solo alla colonna chiave, Column, dall'origine tabulare di input T. Per fare riferimento alla colonna, utilizzare la sintassi toscalar(Column).

Se la sottoquery è una trasformazione tabulare senza un'origine tabulare, l'origine è implicita ed è basata sulle partizioni sottotable.

Per usare questa strategia, specificare o omettere hint.strategy=legacy qualsiasi altra indicazione di strategia.

Nota

Si verificherà un errore se la colonna della partizione, Column, contiene più di 64 valori distinti.

Esempi

Trovare i valori principali

In alcuni casi, è più efficiente e più facile scrivere una query usando l'operatore rispetto all'operatore partition top-nested . La query seguente esegue una sottoquery calcolando summarize e top per ognuno State a partire da W: "WYOMING", "WASHINGTON", "WEST VIRGINIA" e "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 
    ) 

Output

EventType Provincia Eventi Infortuni
Grandine WYOMING 108 0
Vento forte WYOMING 81 5
Tempesta invernale WYOMING 72 0
Raffiche di neve WASHINGTON 82 0
Vento forte WASHINGTON 58 13
Wildfire WASHINGTON 29 0
Vento di tempesta VIRGINIA OCCIDENTALE 180 1
Grandine VIRGINIA OCCIDENTALE 103 0
Clima invernale VIRGINIA OCCIDENTALE 88 0
Vento di tempesta WISCONSIN 416 1
Tempesta invernale WISCONSIN 310 0
Grandine WISCONSIN 303 1

Strategia nativa

La query seguente restituisce i primi 2 EventType valori per TotalInjuries ognuno State che inizia con 'W':

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

Output

EventType TotalInjueries
Tornado 4
Grandine 1
Vento di tempesta 1
Calore eccessivo 0
Vento forte 13
Lightning 5
Vento forte 5
Valanga 3

Strategia casuale

La query seguente restituisce i primi 3 DamagedProperty valori foreach EpisodeId e le colonne EpisodeId e State.

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

Output

Conteggio
22345

Strategia legacy con origine esplicita

La query seguente esegue due sottoquery:

  • Quando x == 1, la query restituisce tutte le righe da StormEvents con InjuriesIndirect == 1.
  • Quando x == 2, la query restituisce tutte le righe da StormEvents con InjuriesIndirect == 2.

Il risultato finale è l'unione di queste due sottoquery.

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

Output

Conteggio
113

Riferimento alla partizione

Nell'esempio seguente viene illustrato come usare l'operatore as per assegnare un "nome" a ogni partizione di dati e quindi riutilizzare tale nome all'interno della sottoquery. Questo approccio è rilevante solo per la legacy strategia.

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