partition, opérateurpartition operator

L’opérateur partition partitionne sa table d’entrée en plusieurs sous-tables en fonction des valeurs de la colonne spécifiée, exécute une sous-requête sur chaque sous-table et génère une seule table de sortie qui est l’Union des résultats de toutes les sous-requêtes.The partition operator partitions its input table into multiple sub-tables according to the values of the specified column, executes a sub-query over each sub-table, and produces a single output table that is the union of the results of all sub-queries.

T | partition by Col1 ( top 10 by MaxValue )

T | partition by Col1 { U | where Col2=toscalar(Col1) }

SyntaxeSyntax

T | partition [PartitionParameters] by colonne ( ContextualSubquery)T | partition [PartitionParameters] by Column ( ContextualSubquery )

T | partition [PartitionParameters] by Column { sous-requête de colonne}T | partition [PartitionParameters] by Column { Subquery }

ArgumentsArguments

  • T: source tabulaire dont les données doivent être traitées par l’opérateur.T: The tabular source whose data is to be processed by the operator.

  • Colonne: le nom d’une colonne dans T dont les valeurs déterminent la façon dont la table d’entrée doit être partitionnée.Column: The name of a column in T whose values determine how the input table is to be partitioned. Consultez les Remarques ci-dessous.See Notes below.

  • ContextualSubquery: expression tabulaire, qui est la source de l' partition opérateur, définie pour une valeur de clé unique.ContextualSubquery: A tabular expression, which source is the source of the partition operator, scoped for a single key value.

  • Sous-requête: expression tabulaire sans source.Subquery: A tabular expression without source. La valeur de clé peut être obtenue via un toscalar() appel.The key value can be obtained via toscalar() call.

  • PartitionParameters: zéro ou plusieurs paramètres (séparés par des espaces) sous la forme : nom = valeur qui contrôle le comportement de l’opérateur.PartitionParameters: Zero or more (space-separated) parameters in the form of: Name = Value that control the behavior of the operator. Les paramètres suivants sont pris en charge :The following parameters are supported:

    NomName ValeursValues DescriptionDescription
    hint.materialized true,falsetrue,false Si la valeur true est, la source de l’opérateur est matérialisée partition (valeur par défaut : false )If set to true will materialize the source of the partition operator (default: false)
    hint.concurrency NombreNumber Indique au système le nombre de partitions à exécuter en parallèle.Hints the system how many partitions to run in parallel. Valeur par défaut: 16.Default: 16.
    hint.spread NombreNumber Indique au système comment distribuer les partitions entre les nœuds de cluster (par exemple : s’il y a N partitions et que l’indicateur de répartition est défini sur P, les partitions N sont alors traitées par des nœuds de cluster différents de manière parallèle ou séquentielle en fonction de l’indicateur de concurrence).Hints the system how to distribute the partitions among cluster nodes (for example: if there are N partitions and the spread hint is set to P then the N partitions will be processed by P different cluster nodes equally in parallel/sequentially depending on the concurrency hint). Valeur par défaut: 1.Default: 1.

RetoursReturns

L’opérateur retourne une Union des résultats de l’application de la sous-requête à chaque partition des données d’entrée.The operator returns a union of the results of applying the subquery to each partition of the input data.

RemarquesNotes

  • L’opérateur de partition est actuellement limité par le nombre de partitions.The partition operator is currently limited by the number of partitions. Jusqu’à 64 partitions distinctes peuvent être créées.Up to 64 distinct partitions may be created. L’opérateur génère une erreur si la colonne de partition (colonne) a plus de 64 valeurs distinctes.The operator will yield an error if the partition column (Column) has more than 64 distinct values.

  • La sous-requête fait référence à la partition d’entrée de manière implicite (il n’y a pas de « nom » pour la partition dans la sous-requête).The subquery references the input partition implicitly (there's no "name" for the partition in the subquery). Pour référencer la partition d’entrée plusieurs fois dans la sous-requête, utilisez l' opérateur as, comme dans l' exemple : partition-Reference ci-dessous.To reference the input partition multiple times within the subquery, use the as operator, as in Example: partition-reference below.

Exemple : cas imbriqué en hautExample: top-nested case

Dans certains cas, il est plus performant et plus facile d’écrire des requêtes à l’aide de l’opérateur partition plutôt que d’utiliser top-nested Operator . l’exemple suivant exécute une sous-requête qui calcule summarize et top for-each des États à partir de W : (Wyoming, Washington, West Virginie, Wisconsin)At some cases - it is more performant and easier to write query using partition operator rather using top-nested operator The next example runs a sub-query calculating summarize and top for-each of States starting with W: (WYOMING, WASHINGTON, WEST VIRGINIA, WISCONSIN)

StormEvents
| where State startswith 'W'
| partition by State 
(
    summarize Events=count(), Injuries=sum(InjuriesDirect) by EventType, State
    | top 3 by Events 
) 

Type d’événementEventType State (État)State ÉvénementsEvents BlesserInjuries
GrêleHail WYOMINGWYOMING 108108 00
Vent élevéHigh Wind WYOMINGWYOMING 8181 55
Tempête d’hiverWinter Storm WYOMINGWYOMING 7272 00
Gros neigeHeavy Snow WASHINGTONWASHINGTON 8282 00
Vent élevéHigh Wind WASHINGTONWASHINGTON 5858 1313
FeuxWildfire WASHINGTONWASHINGTON 2929 00
Vent d’orageThunderstorm Wind WEST VIRGINIAWEST VIRGINIA 180180 11
GrêleHail WEST VIRGINIAWEST VIRGINIA 103103 00
Hiver hiverWinter Weather WEST VIRGINIAWEST VIRGINIA 8888 00
Vent d’orageThunderstorm Wind WISCONSINWISCONSIN 416416 11
Tempête d’hiverWinter Storm WISCONSINWISCONSIN 310310 00
GrêleHail WISCONSINWISCONSIN 303303 11

Exemple : interroger des partitions de données qui ne se chevauchent pasExample: query non-overlapping data partitions

Il est parfois utile (en termes de performances) d’exécuter une sous-requête complexe sur des partitions de données qui ne se chevauchent pas dans un style de carte/réduction.Sometimes it is useful (performance-wise) to run a complex subquery over non-overlapping data partitions in a map/reduce style. L’exemple ci-dessous montre comment créer une répartition manuelle de l’agrégation sur 10 partitions.The example below shows how to create a manual distribution of aggregation over 10 partitions.

StormEvents
| extend p = hash(EventId, 10)
| partition by p
(
    summarize Count=count() by Source 
)
| summarize Count=sum(Count) by Source
| top 5 by Count
SourceSource CountCount
Observateur chevronnéTrained Spotter 1277012770
Respect des loisLaw Enforcement 85708570
PublicPublic 61576157
Gestionnaire des urgencesEmergency Manager 49004900
Observateur COOPCOOP Observer 30393039

Exemple : partitionnement au moment de la requêteExample: query-time partitioning

L’exemple suivant illustre la façon dont la requête peut être partitionnée en N = 10 partitions, où chaque partition calcule son propre nombre et est ensuite résumée dans TotalCount.The following example shows how query can be partitioned into N=10 partitions, where each partition calculates its own Count, and all later summarized into TotalCount.

let N = 10;                 // Number of query-partitions
range p from 0 to N-1 step 1  // 
| partition by p            // Run the sub-query partitioned 
{
    StormEvents 
    | where hash(EventId, N) == toscalar(p) // Use toscalar() to fetch partition key value
    | summarize Count = count()
}
| summarize TotalCount=sum(Count) 
TotalCountTotalCount
5906659066

Exemple : partition-ReferenceExample: partition-reference

L’exemple suivant montre comment utiliser l' opérateur as pour attribuer un « nom » à chaque partition de données, puis réutiliser ce nom dans la sous-requête :The following example shows how one can use the as operator to give a "name" to each data partition and then reuse that name within the subquery:

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

Exemple : sous-requête complexe masquée par un appel de fonctionExample: complex subquery hidden by a function call

La même technique peut être appliquée avec des sous-requêtes bien plus complexes.The same technique can be applied with much more complex subqueries. Pour simplifier la syntaxe, il est possible d’encapsuler la sous-requête dans un appel de fonction :To simplify the syntax, one can wrap the subquery in a function call:

let partition_function = (T:(Source:string)) 
{
    T
    | summarize Count=count() by Source
};
StormEvents
| extend p = hash(EventId, 10)
| partition by p
(
    invoke partition_function()
)
| summarize Count=sum(Count) by Source
| top 5 by Count
SourceSource CountCount
Observateur chevronnéTrained Spotter 1277012770
Respect des loisLaw Enforcement 85708570
PublicPublic 61576157
Gestionnaire des urgencesEmergency Manager 49004900
Observateur COOPCOOP Observer 30393039