Скажем, что у меня есть распределенная система на 3 узлах, и мои данные распределяются между этими узлами. например, у меня есть файл test.csv, который существует на всех трех узлах и содержит 2 столбца:
**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
Затем я использую SparkContext.textFile для чтения файла как rdd и так далее. Насколько я понимаю, каждый искровой рабочий node будет читать часть из файла. Поэтому прямо сейчас скажем, что каждый node будет хранить:
- node 1: строка 1 ~ 4
- node 2: строка 5 ~ 8
- node 3: строка 9 ~ 12
Мой вопрос в том, что, допустим, я хочу делать вычисления по этим данным, и есть один шаг, который мне нужно сгруппировать вместе, поэтому пара значений ключа будет [k1 [{k1 c1} {k1 c2} {k1 c3}]]..
и т.д.
Существует функция groupByKey()
, которая очень дорога в использовании, и рекомендуется использовать aggregateByKey()
. Поэтому мне интересно, как работают groupByKey()
и aggregateByKey()
под капотом? Может кто-нибудь, используя приведенный выше пример, объяснить, пожалуйста? После перетасовки, где строки находятся на каждом node?