分区运算符

partition 运算符根据键列中的值将其输入表的记录分区为多个子表。 该运算符对每个子表运行一个子查询,并生成单个输出表,该表是所有子查询结果的并集。

如果仅需要对属于同一分区键的一部分行执行子查询,而不需要查询整个数据集,则此运算符十分有用。 这些子查询可以包括聚合函数、窗口函数、top N 函数等。

partition 运算符支持多种子查询操作策略:

  • Native - 与包含数千个键分区值的隐式数据源一起使用。
  • Shuffle - 与包含数百万个键分区值的隐式源一起使用。
  • Legacy - 与 64 个或更少键分区值的隐式或显式源一起使用。

语法

T|partition [ hint.strategy=策略 ] [ 提示 ] by(TransformationSubQuery)

T|partition [ hint.strategy=legacy ] [ 提示 ] by{SubQueryWithSource}

详细了解语法约定

参数

客户 类型​​ 必需 说明
T string 输入表格源。
策略 string legacyshufflenative。 此提示定义 partition 运算符的执行策略。

如果未指定任何策略,则使用 legacy 策略。 有关详细信息,请参阅策略
string T 中的一列名称,其值确定如何对输入表格源进行分区。
TransformationSubQuery string 表格转换表达式。 源为通过对 T 的记录进行分区而隐式生成的子表。每个子表在列的值上都是同源的。

表达式必须仅提供一个表格结果,并且不应具有其他类型的语句,例如 let 语句。
SubQueryWithSource string 包含其自己的表格源(例如表引用)的表格表达式。 仅 旧版策略支持此语法。 子查询只能引用 T 中的键列 Column。若要引用列,请使用语法 toscalar(Column)

表达式必须仅提供一个表格结果,并且不应具有其他类型的语句,例如 let 语句。
提示 string 零个或多个以空格分隔的参数,用于控制运算符的行为,格式为:HintName=Value。 请参阅每个策略类型 支持的提示

支持的提示

提示名称 类型 策略 说明
hint.shufflekey string 随机选择 用于使用 shuffle 策略运行分区运算符的分区键。
hint.materialized bool 旧版 如果设置为 true,将对 partition 运算符的源进行具体化。 默认值是 false
hint.concurrency int 旧版 决定要并行运行的分区数量。 默认值为 16
hint.spread int 旧版 决定如何在群集节点之间分配分区。 默认值为 1

例如,如果有 N 个分区,并且扩展提示设置为 P,则 N 个分区将由 P 个不同的群集节点平等并行/顺序地处理,具体取决于并发提示。

返回

此运算符返回各个子查询的结果的并集。

策略

partition 运算符支持多种子查询操作策略:本机随机,和旧版

注意

nativeshuffle 策略之间的区别使调用方能够指示子查询的基数和执行策略。 此选项可能会影响子查询完成所需的时间,但不会更改最终结果。

Native 策略

当分区键的相异值数量不大(以千计)时,应该应用此策略。

子查询必须为表格转换,它不指定表格源。 源是隐式的,将根据子表分区进行分配。 子查询中只能使用某些 受支持的运算符。 分区数量没有限制。

若要使用此策略,请指定 hint.strategy=native

Shuffle 策略

当分区键的相异值数量很大(以百万计)时,应该应用此策略。

子查询必须为表格转换,它不指定表格源。 源是隐式的,将根据子表分区进行分配。 子查询中只能使用某些 受支持的运算符。 分区数量没有限制。

若要使用此策略,请指定 hint.strategy=shuffle。 有关随机策略和性能的详细信息,请参阅随机执行查询

本机和随机策略支持的运算符

以下运算符列表可用于具有本机或随机策略的子查询:

注意

  • 引用子表分区以外的表源的运算符与 nativeshuffle 策略不兼容。 例如,联接联合externaldata评估(插件)。 对于此类情况,请采用 旧策略
  • 任何策略类型都不支持分支运算符,因为子查询必须返回单个表格结果。

Legacy 策略

出于历史原因,策略 legacy 是默认策略。 但是,我们建议使用 本机 策略或 随机 策略,因为 legacy 方法仅限于 64 个分区,并且效率较低。

在某些情况下,legacy 策略可能是必需的,因为它支持在子查询中包含表格源。 在这种情况下,子查询只能从输入表格源 T 引用键列 Column。若要引用列,请使用语法 toscalar(Column)

如果子查询是没有表格源的表格转换,则源是隐式的,并且基于子表分区。

若要使用此策略,请指定 hint.strategy=legacy 或省略任何其他策略指示。

注意

如果分区列 Column 包含超过 64 个非重复值,则会发生错误。

示例

查找顶部值

在某些情况下,使用 partition 运算符编写查询比使用 top-nested 运算符更高效且更方便。 以下查询针对每个以 W 开头的 State 运行计算 summarizetop 的子查询:"WYOMING"、"WASHINGTON"、"WEST VIRGINIA" 和 "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 
    ) 

输出

EventType 状态 事件 Injuries
冰雹 怀俄明州 108 0
疾风 怀俄明州 81 5
冬季风暴 怀俄明州 72 0
大雪 华盛顿州 82 0
疾风 华盛顿州 58 13
野火 华盛顿州 29 0
雷雨大风 西弗吉尼亚州 180 1
冰雹 西弗吉尼亚州 103 0
冬季天气 西弗吉尼亚州 88 0
雷雨大风 威斯康星州 416 1
冬季风暴 威斯康星州 310 0
冰雹 威斯康星州 303 1

Native 策略

以下查询返回按 TotalInjuries 的以“W”开头的每个 State 中的前 2 个 EventType 值:

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

输出

EventType TotalInjueries
龙卷风 4
冰雹 1
雷雨大风 1
极高温 0
疾风 13
Lightning 5
疾风 5
雪崩 3

Shuffle 策略

以下查询返回前 3 个 DamagedProperty 值 foreach EpisodeId 和列 EpisodeIdState

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

输出

Count
22345

使用显式源的 Legacy 策略

以下查询运行两个子查询:

  • x == 1 时,查询从 StormEvents 返回所有具有 InjuriesIndirect == 1 的行。
  • x == 2 时,查询从 StormEvents 返回所有具有 InjuriesIndirect == 2 的行。

最终结果是这两个子查询的并集。

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

输出

Count
113

分区参考

以下示例演示如何使用 as 运算符为每个数据分区指定“名称”,然后在子查询中重复使用该名称。 此方法只与 legacy 策略相关。

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