partition 演算子
パーティション演算子は、キー列の値に従って、入力テーブルのレコードを複数のサブテーブルにパーティション分割します。 演算子は、各サブテーブルに対してサブクエリを実行し、すべてのサブクエリの結果の和集合である 1 つの出力テーブルを生成します。
この演算子は、同じパーティション キーに属する行のサブセットに対してのみサブクエリを実行する必要があり、データセット全体に対してクエリを実行しない場合に便利です。 これらのサブクエリには、集計関数、ウィンドウ関数、上位 N などが含まれます。
partition 演算子は、サブクエリ操作のいくつかの方法をサポートしています。
- ネイティブ - 何千ものキーパーティション値を持つ暗黙的なデータソースと共に使用します。
- シャッフル - 何百万ものキーパーティション値を持つ暗黙的なソースと共に使用します。
- レガシ - 64以下のキーパーティション値に対して、暗黙的または明示的なソースと共に使用します。
構文
T|
partition
[ hint.strategy=
Strategy ] [ Hints ] by
Column(
TransformationSubQuery)
T|
partition
[ hint.strategy=legacy
] [ Hints ] by
Column{
SubQueryWithSource}
構文規則について詳しく知る。
パラメーター
名前 | 型 | 必須 | 説明 |
---|---|---|---|
T | string |
✔️ | 入力表形式のソース。 |
戦略 | string |
値 legacy 、、 shuffle または native 。 このヒントは、パーティション演算子の実行戦略を定義します。戦略が指定されていない場合は、 legacy 戦略が使用されます。 詳細については、「 戦略」を参照してください。 |
|
列 | string |
✔️ | 入力表形式ソースのパーティション分割方法を決定する値を持つ T の列の名前。 |
TransformationSubQuery | string |
✔️ | 表形式の変換式。 ソースは暗黙的に 、T のレコードをパーティション分割することによって生成されるサブテーブルです。各サブテーブルは 、Column の値に対して同種です。 式は表形式の結果を 1 つだけ指定する必要があり、ステートメントなどの let 他の種類のステートメントを含めることはできません。 |
SubQueryWithSource | string |
✔️ | テーブル参照など、独自の表形式ソースを含む表形式の式。 この構文は、 レガシ戦略でのみサポートされています。 サブクエリは、T からのキー列 Column のみを参照できます。列を参照するには、構文 toscalar( Column を使用します) 。式は表形式の結果を 1 つだけ指定する必要があり、ステートメントなどの let 他の種類のステートメントを含めることはできません。 |
[ヒント] | string |
演算子の動作を制御する HintName= Value という形式の 0 個以上のスペース区切りパラメーター。 戦略の種類ごとに サポートされているヒント を参照してください。 |
サポートされているヒント
ヒント名 | 型 | 戦略 | 説明 |
---|---|---|---|
hint.shufflekey |
string |
シャッフル | 戦略でパーティション演算子を実行するために使用される shuffle パーティション キー。 |
hint.materialized |
bool |
レガシー | true に設定されている場合、partition 演算子のソースを具体化します。 既定値は false です。 |
hint.concurrency |
int |
レガシー | 並列で実行するパーティションの数を決定します。 既定値は 16 です。 |
hint.spread |
int |
レガシー | クラスター ノード間でパーティションを分散する方法を決定します。 既定値は 1 です。たとえば、 N 個のパーティションがあり、スプレッド ヒントが P に設定されている場合、 N 個のパーティションは、コンカレンシー ヒントに応じて、 P のさまざまなクラスター ノードによって並列または順次に処理されます。 |
戻り値
演算子は、個々のサブクエリの結果の和集合を返します。
方法
パーティション演算子では、サブクエリ操作のいくつかの戦略 ( ネイティブ、 シャッフル、レガシ) がサポート されています。
注意
と shuffle
戦略のnative
区別により、呼び出し元はサブクエリのカーディナリティと実行戦略を示すことができます。 この選択は、サブクエリの完了にかかる時間に影響を与える可能性がありますが、最終的な結果は変更されません。
ネイティブ戦略
この方法は、パーティション キーの個別の値の数が大きくなっていない場合に適用する必要があります。おおよそ数千です。
サブクエリは、表形式のソースを指定しない表形式の変換である必要があります。 ソースは暗黙的であり、サブテーブルのパーティションに従って割り当てられます。 サブクエリでは、 サポートされている 特定の演算子のみを使用できます。 パーティションの数に制限はありません。
この方法を使用するには、 を指定します hint.strategy=native
。
シャッフル戦略
この戦略は、パーティション キーの個別の値の数が数百万単位で大きい場合に適用する必要があります。
サブクエリは、表形式のソースを指定しない表形式の変換である必要があります。 ソースは暗黙的であり、サブテーブルのパーティションに従って割り当てられます。 サブクエリでは、 サポートされている 特定の演算子のみを使用できます。 パーティションの数に制限はありません。
この方法を使用するには、 を指定します 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
- トップヒッター
- top-nested
- where
注意
- サブテーブル パーティション以外のテーブル ソースを参照する演算子は、 および 戦略と
native
shuffle
互換性がありません。 たとえば、join、union、externaldata、evaluate (プラグイン) などです。 このようなシナリオでは、 従来の戦略に頼ります。 - サブ クエリは 1 つの表形式の結果を返す必要があり、フォーク演算子はどの戦略の種類でもサポートされていません。
レガシ戦略
歴史的な理由から、 legacy
戦略は既定の戦略です。 ただし、このアプローチは 64 個のパーティションに制限されており、効率が低い場合はlegacy
ネイティブまたはシャッフル戦略を優先することをお勧めします。
一部のシナリオでは、サブクエリに legacy
表形式のソースを含める方法がサポートされているため、戦略が必要になる場合があります。 このような場合、サブクエリは、入力表形式のソース T からキー列 Column のみを参照できます。列を参照するには、Column 構文toscalar(
を使用します)
。
サブクエリが表形式ソースのない表形式変換の場合、ソースは暗黙的であり、サブテーブル パーティションに基づいています。
この戦略を使用するには、他の戦略表示を指定 hint.strategy=legacy
または省略します。
Note
パーティション列 Column に 64 を超える個別の値が含まれている場合、エラーが発生します。
例
上位の値を検索する
場合によっては、 演算子を使用するよりも、 演算子を使用する方がパフォーマンスが高く、クエリを partition
記述する方が top-nested
簡単です。 次のクエリでは、"WYOMING"、"WASHINGTON"、"WEST バージニア"、および "DATASET" で始まるW
サブState
クエリと を計算summarize
top
して実行します。
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 | 州 | イベント | 怪我 |
---|---|---|---|
ひょう | WYOMING | 108 | 0 |
High Wind | WYOMING | 81 | 5 |
Winter Storm | WYOMING | 72 | 0 |
大雪 | WASHINGTON | 82 | 0 |
High Wind | WASHINGTON | 58 | 13 |
Wildfire | WASHINGTON | 29 | 0 |
雷雨風 | ウェストバージニア | 180 | 1 |
ひょう | ウェストバージニア | 103 | 0 |
冬の天気 | ウェストバージニア | 88 | 0 |
雷雨風 | WISCONSIN | 416 | 1 |
Winter Storm | WISCONSIN | 310 | 0 |
ひょう | WISCONSIN | 303 | 1 |
ネイティブ戦略
次のクエリでは、'W' で始まるごとにState
、 のTotalInjuries
上位 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 |
---|---|
Tornado | 4 |
ひょう | 1 |
雷雨風 | 1 |
過剰な熱 | 0 |
High Wind | 13 |
Lightning | 5 |
High Wind | 5 |
雪崩 | 3 |
シャッフル戦略
次のクエリは、上位 3 DamagedProperty
つの foreach EpisodeId
値と 列 EpisodeId
と State
を返します。
StormEvents
| partition hint.strategy=shuffle by EpisodeId
(
top 3 by DamageProperty
| project EpisodeId, State, DamageProperty
)
| count
出力
Count |
---|
22345 |
明示的なソースを使用したレガシ戦略
次のクエリでは、2 つのサブクエリが実行されます。
- の場合
x == 1
、クエリは、 を持つInjuriesIndirect == 1
からStormEvents
すべての行を返します。 - の場合
x == 2
、クエリは、 を持つInjuriesIndirect == 2
からStormEvents
すべての行を返します。
最終的な結果は、これら 2 つのサブクエリの和集合です。
range x from 1 to 2 step 1
| partition hint.strategy=legacy by x {StormEvents | where x == InjuriesIndirect}
| count
出力
Count |
---|
113 |
パーティションリファレンス
次の例は、as 演算子を使用して各データ パーティションに "name"を指定し、サブクエリ内でその名前を再利用する方法を示しています。 このアプローチは、戦略にのみ関連 legacy
します。
T
| partition by Dim
(
as Partition
| extend MetricPct = Metric * 100.0 / toscalar(Partition | summarize sum(Metric))
)
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示