Scala Искробезопасное выполнение смежных подмножеств СДР - PullRequest
0 голосов
/ 20 января 2020

Уже почти 4 дня я борюсь с этой проблемой и не могу найти эффективного решения.

У меня есть RDD в Spark в форме RDD[(Int, (Date, Double)] (первое значение - просто индекс).

Как вы думаете, какой самый эффективный способ в Spark получить СДР в качестве выходного сигнала, где каждый элемент - это своего рода функция, применяемая к элементам всех подмножеств, составленных из n смежных элементов входного СДР? ?

Например, если задано как функция среднее и n = 5, результат должен быть:

input:  [1.0, 2.0, 3.0, 2.0, 6.0, 4.0, 3.0, 4.0, 3.0, 2.0]
output: [                    2.8, 3.4, 3.6, 3.8, 4.0, 3.2]

Потому что:

1.0 + 2.0 + 3.0 + 2.0 + 6.0 = 14.0 / 5 = 2.8
2.0 + 3.0 + 2.0 + 6.0 + 4.0 = 17.0 / 5 = 3.4
3.0 + 2.0 + 6.0 + 4.0 + 3.0 = 18.0 / 5 = 3.6
2.0 + 6.0 + 4.0 + 3.0 + 4.0 = 19.0 / 5 = 3.8
6.0 + 4.0 + 3.0 + 4.0 + 3.0 = 20.0 / 5 = 4.0
4.0 + 3.0 + 4.0 + 3.0 + 2.0 = 16.0 / 5 = 3.2

Это было бы очень легко решить, но в Scala и Spark я очень новичок, и я не знаю, какой будет наилучшая практика в этом случае.

Я испробовал множество решений, в том числе некий вложенный map (), но, конечно, Spark не допускает такого поведения. Некоторые из них работают, но не очень эффективны.

Какой способ решения этой проблемы вы считаете лучшим c алгоритмом в Scala Spark?

1 Ответ

2 голосов
/ 22 января 2020

Вы можете использовать функцию mllib sliding:

import org.apache.spark.mllib.rdd.RDDFunctions._

val rdd = sc.parallelize(Seq(1.0, 2.0, 3.0, 2.0, 6.0, 4.0, 3.0, 4.0, 3.0, 2.0))
def average(x: Array[Double]) = x.sum / x.length
rdd.sliding(5).map(average).collect.mkString(", ") // 2.8, 3.4, 3.6, 3.8, 4.0, 3.2
...