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ýshuffle
kompatibilní operátor (join
,summarize
make-series
nebopartition
) na levé nebo pravé straně. - Operátor se
summarize
v dotazu zobrazí za jinýmshuffle
operátorem kompatibilním s operátorem (join
,summarize
make-series
nebopartition
).
Syntax
S hint.strategy
= shuffle
T|
DataExpression|
join
hint.strategy
= shuffle
(
DataExpression)
T|
summarize
hint.strategy
= shuffle
DataExpression
T|
Dotazu|
Dělení hint.strategy
(
= shuffle
poddotazování)
S hint.shufflekey
= klíčem
T|
DataExpression|
join
hint.shufflekey
= Klíč(
DataExpression)
T|
summarize
hint.shufflekey
= klíčDataExpression
T|
make-series
hint.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 EpisodeId
tento 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 summarize
dotazem 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
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro