分区运算符
partition 运算符根据键列中的值将其输入表的记录分区为多个子表。 该运算符对每个子表运行一个子查询,并生成单个输出表,该表是所有子查询结果的并集。
如果仅需要对属于同一分区键的一部分行执行子查询,而不需要查询整个数据集,则此运算符十分有用。 这些子查询可以包括聚合函数、窗口函数、top N 函数等。
partition 运算符支持多种子查询操作策略:
语法
T |
partition
[ hint.strategy=
Strategy ] [ Hints ] by
Column (
TransformationSubQuery )
T |
partition
[ hint.strategy=legacy
] [ Hints ] by
Column {
SubQueryWithSource }
详细了解语法约定。
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
T | string |
✔️ | 输入表格源。 |
策略 | string |
值 legacy 、shuffle 或 native 。 此提示定义 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 运算符支持多种子查询操作策略:本机、随机,和旧版。
注意
native
和 shuffle
策略之间的区别使调用方能够指示子查询的基数和执行策略。 此选项可能会影响子查询完成所需的时间,但不会更改最终结果。
Native 策略
当分区键的相异值数量不大(以千计)时,应该应用此策略。
子查询必须为表格转换,它不指定表格源。 源是隐式的,将根据子表分区进行分配。 子查询中只能使用某些 受支持的运算符。 分区数量没有限制。
若要使用此策略,请指定 hint.strategy=native
。
Shuffle 策略
当分区键的相异值数量很大(以百万计)时,应该应用此策略。
子查询必须为表格转换,它不指定表格源。 源是隐式的,将根据子表分区进行分配。 子查询中只能使用某些 受支持的运算符。 分区数量没有限制。
若要使用此策略,请指定 hint.strategy=shuffle
。 有关随机策略和性能的详细信息,请参阅随机执行查询。
本机和随机策略支持的运算符
以下运算符列表可用于具有本机或随机策略的子查询:
- count
- distinct
- extend
- make-series
- mv-apply
- mv-expand
- parse
- parse-where
- project
- project-away
- project-keep
- project-rename
- project-reorder
- reduce
- sample
- sample-distinct
- scan
- search
- 序列化
- sort
- summarize
- take
- 返回页首
- top-hitters
- top-nested
- where
注意
Legacy 策略
出于历史原因,策略 legacy
是默认策略。 但是,我们建议使用 本机 策略或 随机 策略,因为 legacy
方法仅限于 64 个分区,并且效率较低。
在某些情况下,legacy
策略可能是必需的,因为它支持在子查询中包含表格源。 在这种情况下,子查询只能从输入表格源 T 引用键列 Column。若要引用列,请使用语法 toscalar(
Column)
。
如果子查询是没有表格源的表格转换,则源是隐式的,并且基于子表分区。
若要使用此策略,请指定 hint.strategy=legacy
或省略任何其他策略指示。
注意
如果分区列 Column 包含超过 64 个非重复值,则会发生错误。
示例
查找顶部值
在某些情况下,使用 partition
运算符编写查询比使用 top-nested
运算符更高效且更方便。 以下查询针对每个以 W
开头的 State
运行计算 summarize
和 top
的子查询:"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
和列 EpisodeId
和 State
。
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))
)