这是我的例子。
val arr = Array((1,2), (1,3), (1,4), (2,3), (4,5))
val data = sc.parallelize(arr, 5)
data.glom.map(_length).collect
Array[Int] = Array(1, 1, 1, 1, 1)
val agg = data.reduceByKey(_+_)
agg.glom.map(_.length).collect
Array[Int] = Array(0, 1, 1, 0, 1)
val fil = agg.filter(_._2 < 4)
fil.glom.map(_.length).collect
Array[Int] = Array(0, 0, 1, 0, 0)
val sub = data.map{case(x,y) => (x, (x,y))}.subtractByKey(fil).map(_._2)
Array[(Int, Int)] = Array((1,4), (1,3), (1,2), (4,5))
sub.glom.map(_.length).collect
Array[Int] = Array(0, 3, 0, 0, 1)
我想知道的是平均分配分区。
该data
变量由五个分区组成,所有数据均分。
ex)par1: (1,2)
par2: (1,3)
par3: (1,4)
par4: (2,3)
par5: (4,5)
几次之后transformation operation
,分配给sub
变量的五个分区中只有两个被使用。
该sub
变量由五个分区组成,但并非所有数据都被均匀分区。
ex)par1: empty
par2: (1,2),(1,3),(1,4)
par3: empty
par4: empty
par5: (4,5)
如果我将另一个添加transformation operation
到sub
变量中,将有 5 个可用分区,但只有 2 个分区用于操作。
ex)sub.map{case(x,y) => (x, x, (x,y))}
所以我想在操作数据时利用所有可用的分区。
我用了这个repartition
方法,但它并不便宜。
ex) sub.repartition(5).glom.map(_.length).collect
Array[Int] = Array(0, 1, 1, 2, 0)
所以我正在寻找一种明智的方法来利用尽可能多的分区。
有什么好办法吗?