假设我有一个分布式系统,由3个节点组成,我的数据在这些节点之间分布。例如,我有一个test.csv文件,在所有3个节点上都存在,并且包含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等内容。据我理解,每个Spark工作节点将从文件中读取一部分。所以现在假设每个节点将存储:- 节点1:第1到4行 - 节点2:第5到8行 - 节点3:第9到12行
我的问题是,假设我想对这些数据进行计算,并且有一个步骤需要将键分组在一起,因此键值对将是
[k1 [{k1 c1} {k1 c2} {k1 c3}]]..
等等。有一个名为
groupByKey()
的函数,使用它非常昂贵,建议使用aggregateByKey()
。因此,我想知道groupByKey()
和aggregateByKey()
在背后如何工作?可以用我提供的示例来解释吗?洗牌后,每个节点上的行位于哪里?