Powiedz, że mam system dystrybucji na 3 węzłach, a moje dane są dystrybuowane między tymi węzłami. na przykład mam pliku test.csv który istnieje na wszystkich 3 węzłów i zawiera 2 kolumny:Jak działa funkcja agregacji Spark - działa funkcja aggregateByKey?
**row | id, c.**
---------------
row1 | k1 , c1
row2 | k1 , c2
row3 | k1 , c3
row4 | k2 , c4
row5 | k2 , c5
row6 | k2 , c6
row7 | k3 , c7
row8 | k3 , c8
row9 | k3 , c9
row10 | k4 , c10
row11 | k4 , c11
row12 | k4 , c12
Następnie używam SparkContext.textFile odczytać pliku jako RDD i tak. O ile rozumiem, każdy węzeł roboczy iskrzenia odczyta fragment z pliku. Więc teraz powiedzmy, że każdy węzeł będzie przechowywać:
- węzeł 1: wiersz 1 ~ 4
- węzła 2: wiersz 5 ~ 8
- węzła 3: wiersz 9 ~ 12
My pytanie brzmi: powiedzmy, że chcę wykonać obliczenia na tych danych i jest jeden krok, który muszę zgrupować klucz razem, więc kluczowa para wartości będzie [k1 [{k1 c1} {k1 c2} {k1 c3}]]..
i tak dalej.
Istnieje funkcja o nazwie groupByKey()
, która jest bardzo kosztowna w użyciu i zalecana jest wersja aggregateByKey()
. Zastanawiam się więc, w jaki sposób działa groupByKey()
i aggregateByKey()
pod maską? Czy ktoś, kto może posłużyć się przykładem podanym powyżej, może to wyjaśnić? Po przetasowaniu gdzie znajdują się wiersze na każdym węźle?
ok, więc pozwala wrócić do mojego przykładu, jeśli node1 został row1 ~ row3 Node2 został row4 ~ row6 i Node3 został row7 do row12. i kiedy robię groupByKey, czy dane będą się poruszać w ogóle, czy nic się nie poruszy, skoro rdd z tym samym kluczem jest już w tym samym węźle? dzięki – EdwinGuo
@EdwinGuo żadne dane nie mogą wciąż się przemieszczać, załóżmy, że używasz partycji mieszającej, jeśli wszystkie k1 znajdują się w węźle 1, ale wynik mieszania k1 na poziomie 3 to nadal będzie trzeci węzeł. – aaronman
Ale jeśli nie zwracaj uwagi na kolejność, po prostu chcę zwrócić tablicę ze wszystkimi wartościami, na przykład groupByKey. Czy jest to możliwe z inną składnią niż groupbykey? –