Это мой пример.
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)
Поэтому я ищу разумный способ использовать как можно больше разделов.
Есть ли хороший способ?