你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

分区运算符

适用于:✅✅Azure 数据资源管理器Azure Monitor✅ Sentinel

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

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

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

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

语法

T|partition [ hint.strategy=Strategy ] [ Hints ] byColumn(TransformationSubQuery)

T|partition [ hint.strategy=legacy ] [ Hints ] byColumn{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 或省略任何其他策略指示。

注意

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

示例

本节中的示例演示如何使用语法帮助你入门。

本文中的示例使用 帮助群集中的公开可用表,例如 示例 数据库中的 StormEvents 表。

本文中的示例使用公开可用的表,例如天气分析中的 StormEvents示例数据

查找顶部值

在某些情况下,使用 partition 运算符编写查询比使用 top-nested 运算符更高效且更方便。 以下查询针对每个以 summarize 开头的 top 运行计算 StateW 的子查询:"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 策略

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

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))
)