【发布时间】:2019-01-26 19:00:15
【问题描述】:
我有两个结构为 RDD[String, Int] 的 RDD 对,分别称为 rdd1 和 rdd2。
这些 RDD 中的每一个都按其键分组,我想对其值执行一个函数(因此我将使用 mapValues 方法)。 “GroupByKey”方法是为每个键创建一个新分区还是让我使用“partitionBy”手动指定?
我知道如果我不执行更改键的操作,RDD 的分区不会改变,所以如果我对每个 RDD 执行 mapValues 操作,或者如果我在前两个 RDD 之间执行连接操作,生成的 RDD 的分区不会改变。 是真的吗?
这里有一个代码示例。请注意,“功能”没有定义,因为它在这里并不重要。
val lvl1rdd=rdd1.groupByKey()
val lvl2rdd=rdd2.groupByKey()
val lvl1_lvl2=lvl1rdd.join(lvl2rdd)
val finalrdd=lvl1_lvl2.mapValues(value => function(value))
如果我加入之前的 RDD 并在生成的 RDD (mapValues) 的值上执行一个函数,则所有工作都在单个 worker 中完成,而不是将不同的任务分布在集群的不同 worker 节点上。我的意思是,期望的行为应该是并行执行作为参数传递给 mapValues 方法的函数,在集群允许的这么多节点中。
【问题讨论】:
标签: scala apache-spark rdd partitioning