partition 演算子

パーティション演算子は、キー列の値に従って、入力テーブルのレコードを複数のサブテーブルにパーティション分割します。 演算子は、各サブテーブルに対してサブクエリを実行し、すべてのサブクエリの結果の和集合である 1 つの出力テーブルを生成します。

この演算子は、同じパーティション キーに属する行のサブセットに対してのみサブクエリを実行する必要があり、データセット全体に対してクエリを実行しない場合に便利です。 これらのサブクエリには、集計関数、ウィンドウ関数、上位 N などが含まれます。

partition 演算子は、サブクエリ操作のいくつかの方法をサポートしています。

  • ネイティブ - 何千ものキーパーティション値を持つ暗黙的なデータソースと共に使用します。
  • シャッフル - 何百万ものキーパーティション値を持つ暗黙的なソースと共に使用します。
  • レガシ - 64以下のキーパーティション値に対して、暗黙的または明示的なソースと共に使用します。

構文

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

T|partition [ hint.strategy=legacy ] [ Hints ] byColumn{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。 シャッフル戦略とパフォーマンスの詳細については、「 シャッフル クエリ」を参照してください。

ネイティブおよびシャッフル戦略でサポートされている演算子

次の演算子の一覧は、ネイティブまたはシャッフル戦略を使用してサブクエリで使用できます。

注意

  • サブテーブル パーティション以外のテーブル ソースを参照する演算子は、 および 戦略とnativeshuffle互換性がありません。 たとえば、joinunionexternaldata、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クエリと を計算summarizetopして実行します。

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 値と 列 EpisodeIdStateを返します。

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