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

partition 运算符

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

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

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

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

语法

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

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

详细了解语法约定

参数

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

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

表达式必须仅提供一个表格结果,并且不应具有其他类型的语句,例如 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 不同群集节点平均并行/按顺序处理,具体取决于并发提示。

返回

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

策略

分区运算符支持多种子查询操作策略: 本机随机旧式

备注

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

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 运算符更轻松。 以下查询运行一个子查询,计算StateW每个top以 开头的子查询summarize:“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 策略

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

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