shuffle query

Dotaz shuffle je sémantická transformace, která se používá se sadou operátorů, které podporují danou strategii shuffle . V závislosti na příslušných datech může dotazování pomocí shuffle strategie přinést lepší výkon. Strategii dotazu náhodného shuffle je lepší použít, když shuffle má klíč ( join klíč, summarize klíč, make-series klíč nebo partition klíč) vysokou kardinalitu a běžný dotaz operátoru dosáhne limitů dotazů.

S příkazem shuffle můžete použít následující operátory:

Pokud chcete použít strategii shuffle dotazu, přidejte výraz hint.strategy = shuffle nebo hint.shufflekey = <key>. Když použijete hint.strategy=shuffle, budou data operátoru zamíchaná všemi klíči. Tento výraz použijte, když je složený klíč jedinečný, ale každý klíč není dostatečně jedinečný, takže data zamícháte pomocí všech klíčů promíchaného operátoru.

Při dělení dat pomocí strategie náhodného prohazování se zatížení dat sdílí na všech uzlech clusteru. Každý uzel zpracovává jeden oddíl dat. Výchozí počet oddílů se rovná počtu uzlů clusteru.

Číslo oddílu lze přepsat pomocí syntaxe hint.num_partitions = total_partitions, která určuje počet oddílů. To je užitečné, pokud má cluster malý počet uzlů clusteru a výchozí počet oddílů bude malý a dotaz selže nebo trvá dlouhou dobu provádění.

Poznámka

Použití mnoha oddílů může spotřebovávat více prostředků clusteru a snížit výkon. Vyberte číslo oddílu opatrně tak, že začnete s hint.strategy = shuffle a začnete postupně navyšovat oddíly.

V některých případech hint.strategy = shuffle se příkaz ignoruje a dotaz se nespustí ve shuffle strategii. K tomu může dojít v těchto případech:

  • Operátor join má jiný shufflekompatibilní operátor (join, summarizemake-series nebo partition) na levé nebo pravé straně.
  • Operátor se summarize v dotazu zobrazí za jiným shuffleoperátorem kompatibilním s operátorem (join, summarizemake-series nebo partition).

Syntax

S hint.strategy = shuffle

T|DataExpression|joinhint.strategy = shuffle(DataExpression)

T|summarizehint.strategy = shuffleDataExpression

T|Dotazu| Dělení hint.strategy( = shufflepoddotazování)

S hint.shufflekey = klíčem

T|DataExpression|joinhint.shufflekey = Klíč(DataExpression)

T|summarizehint.shufflekey = klíčDataExpression

T|make-serieshint.shufflekey = klíčDataExpression

T|Dotazu|Poddotazklíče( oddílu hint.shufflekey = )

Přečtěte si další informace o konvencích syntaxe.

Parametry

Název Typ Vyžadováno Popis
T string ✔️ Tabulkový zdroj, jehož data má operátor zpracovat.
DataExpression string Implicitní nebo explicitní výraz tabulkové transformace.
Dotaz string Na záznamech T se spustí transformační výraz.
Klíč string join Použijte klíč, summarize klíč, make-series klíč nebo partition klíč.
Poddotaz string Transformační výraz.

Poznámka

V závislosti na zvolené syntaxi je nutné zadat DataExpression nebo Query .

Příklady

Použití funkce sumarizace s prohazem

Dotaz shuffle strategie s operátorem summarize sdílí zatížení na všech uzlech clusteru, kde každý uzel zpracovává jeden oddíl dat.

StormEvents
| summarize hint.strategy = shuffle count(), avg(InjuriesIndirect) by State
| count 

Výstup

Počet
67

Použití spojení s shuffle

StormEvents
| where State has "West"
| where EventType has "Flood"
| join hint.strategy=shuffle 
    (
    StormEvents
    | where EventType has "Hail"
    | project EpisodeId, State, DamageProperty
    )
    on State
| count

Výstup

Počet
103

Použití řady make-series s prohazem

StormEvents
| where State has "North"
| make-series hint.shufflekey = State sum(DamageProperty) default = 0 on StartTime in range(datetime(2007-01-01 00:00:00.0000000), datetime(2007-01-31 23:59:00.0000000), 15d) by State

Výstup

Stav sum_DamageProperty StartTime
SEVERNÍ DAKOTA [60000,0,0] ["2006-12-31T00:00:00.000000Z","2007-01-15T00:100:00.0000000Z","2007-01-30T00:00:00.0000000Z"]
SEVERNÍ KAROLÍNA [20000,0,1000] ["2006-12-31T00:00:00.000000Z","2007-01-15T00:100:00.0000000Z","2007-01-30T00:00:00.0000000Z"]
SEVERNÍ ATLANTIK [0,0,0] ["2006-12-31T00:00:00.000000Z","2007-01-15T00:100:00.0000000Z","2007-01-30T00:00:00.0000000Z"]

Použití oddílu s prohazovacím příkazem

StormEvents
| partition hint.strategy=shuffle by EpisodeId
(
    top 3 by DamageProperty
    | project EpisodeId, State, DamageProperty
)
| count

Výstup

Počet
22345

Porovnání hint.strategy=shuffle a hint.shufflekey=key

Pokud použijete hint.strategy=shuffle, bude operátor promíchaný všemi klávesami zamíchaný. V následujícím příkladu dotaz promíchá data pomocí EpisodeId obou klíčů a EventId :

StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| join kind = inner hint.strategy=shuffle (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId
| count

Výstup

Počet
14

Následující dotaz používá hint.shufflekey = key. Výše uvedený dotaz odpovídá tomuto dotazu.

StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| join kind = inner hint.shufflekey = EpisodeId hint.shufflekey = EventId (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId

Výstup

Počet
14

Náhodné zamíchání dat pomocí více klíčů

V některých případech hint.strategy=shuffle se příkaz ignoruje a dotaz se nespustí ve strategii náhodného shuffle. Například v následujícím příkladu má spojení na levé straně souhrn, takže použití hint.strategy=shuffle nepoužije strategii náhodného prohazování dotazu:

StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| summarize count() by EpisodeId, EventId
| join kind = inner hint.strategy=shuffle (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId

Výstup

Id epizody EventId ... Id epizody1 Id události 1 ...
1030 4407 ... 1030 4407 ...
1030 13721 ... 1030 13721 ...
2477 12530 ... 2477 12530 ...
2103 10237 ... 2103 10237 ...
2103 10239 ... 2103 10239 ...
... ... ... ... ... ...

Pokud chcete tento problém vyřešit a spustit strategii náhodného shuffle, zvolte klíč, který je pro operace a join společnýsummarize. V tomto případě je EpisodeIdtento klíč . Pomocí nápovědy hint.shufflekey určete klávesu náhodného prohazku na hint.shufflekey = EpisodeId:join

StormEvents
| where StartTime > datetime(2007-01-01 00:00:00.0000000)
| summarize count() by EpisodeId, EventId
| join kind = inner hint.shufflekey=EpisodeId (StormEvents | where DamageCrops > 62000000) on EpisodeId, EventId

Výstup

Id epizody EventId ... Id epizody1 Id události 1 ...
1030 4407 ... 1030 4407 ...
1030 13721 ... 1030 13721 ...
2477 12530 ... 2477 12530 ...
2103 10237 ... 2103 10237 ...
2103 10239 ... 2103 10239 ...
... ... ... ... ... ...

Použití funkce Summarize s prohazem ke zlepšení výkonu

V tomto příkladu použití operátoru summarize se shuffle strategií zlepšuje výkon. Zdrojová tabulka obsahuje 150M záznamů a kardinalita skupiny podle klíče je 10M, což je rozložené do 10 uzlů clusteru.

Při použití summarize operátoru bez shuffle strategie se dotaz ukončí po 1:08 a špička využití paměti je ~3 GB:

orders
| summarize arg_max(o_orderdate, o_totalprice) by o_custkey 
| where o_totalprice < 1000
| count

Výstup

Počet
1086

Při použití shuffle strategie s summarizedotazem skončí po přibližně 7 sekundách a špička využití paměti je 0,43 GB:

orders
| summarize hint.strategy = shuffle arg_max(o_orderdate, o_totalprice) by o_custkey 
| where o_totalprice < 1000
| count

Výstup

Počet
1086

Následující příklad ukazuje výkon v clusteru se dvěma uzly clusteru s tabulkou obsahující 60M záznamů, kde kardinalita skupiny podle klíče je 2M.

Spuštění dotazu bez hint.num_partitions bude používat pouze dva oddíly (jako číslo uzlů clusteru) a následující dotaz bude trvat přibližně 1:10 min:

lineitem 
| summarize hint.strategy = shuffle dcount(l_comment), dcount(l_shipdate) by l_partkey 
| consume

Pokud nastavíte číslo oddílů na 10, dotaz skončí po 23 sekundách:

lineitem 
| summarize hint.strategy = shuffle hint.num_partitions = 10 dcount(l_comment), dcount(l_shipdate) by l_partkey 
| consume

Zlepšení výkonu pomocí funkce Join with shuffle

Následující příklad ukazuje, jak použití shuffle strategie s operátorem join zlepšuje výkon.

Příklady byly vzorkovány v clusteru s 10 uzly, kde jsou data rozložená na všech těchto uzlech.

Levá zdrojová tabulka dotazu obsahuje 15M záznamů, přičemž kardinalita join klíče je ~14 min. Pravý zdroj dotazu má 150M záznamů a kardinalita join klíče je 10M. Dotaz skončí po přibližně 28 sekundách a špička využití paměti je 1,43 GB:

customer
| join
    orders
on $left.c_custkey == $right.o_custkey
| summarize sum(c_acctbal) by c_nationkey

Při použití shuffle strategie s operátorem join se dotaz ukončí po ~4 sekundách a špička využití paměti je 0,3 GB:

customer
| join
    hint.strategy = shuffle orders
on $left.c_custkey == $right.o_custkey
| summarize sum(c_acctbal) by c_nationkey

V jiném příkladu vyzkoušíme stejné dotazy na větší datovou sadu s následujícími podmínkami:

  • Levý zdroj join je 150M a kardinalita klíče je 148M.
  • Pravý zdroj join je 1,5B a kardinalita klíče je ~100M.

Dotaz s operátorem join dosáhne limitů a časových limitů po 4 minutách. Při použití shuffle strategie s operátorem join však dotaz skončí po ~34 sekundách a špička využití paměti je 1,23 GB.

Následující příklad ukazuje vylepšení clusteru se dvěma uzly clusteru s tabulkou 60M záznamů, kde kardinalita join klíče je 2M. Spuštění dotazu bez hint.num_partitions bude používat pouze dva oddíly (jako číslo uzlů clusteru) a následující dotaz bude trvat přibližně 1:10 min:

lineitem
| summarize dcount(l_comment), dcount(l_shipdate) by l_partkey
| join
    hint.shufflekey = l_partkey   part
on $left.l_partkey == $right.p_partkey
| consume

Když nastavíte číslo oddílů na 10, dotaz skončí po 23 sekundách:

lineitem
| summarize dcount(l_comment), dcount(l_shipdate) by l_partkey
| join
    hint.shufflekey = l_partkey  hint.num_partitions = 10    part
on $left.l_partkey == $right.p_partkey
| consume