Итеративная функция Spark CUSUM
Я все еще довольно новичок в Spark, и я изо всех сил пытаюсь реализовать итерированную функцию. Я надеюсь, что кто-то может мне помочь?
В частности, я пытаюсь реализовать контрольную статистику CUSUM:
$ S_i = \ max (0, S_ {i-1} + x_i - Target - w $ с $ S_0 = 0 $ и $ w, причем Target $ - фиксированные параметры.
Проблема в том, что статистика CUSUM определяется как итеративная функция, которая требует упорядоченных данных и предыдущего значения функции.
Следующий фрейм данных показывает желаемый результат для $ Target = 1 $ и $ w = 0.1 $:
i x S
--------------
1 1.3 0.2
2 1.8 0.9
3 0.5 0.3
4 0.6 0
5 1.2 0.1
6 1.8 0.8
С другой стороны: я думаю, что невозможно запустить CUSUM в распределенном режиме? Мой набор данных довольно большой, но содержит несколько групп. Я надеюсь, что это означает, что я все еще могу достичь некоторого параллелизма. Я предполагаю, что мне нужно заново разделить мои данные, чтобы иметь один отдельный раздел на группу, чтобы одновременно запустить алгоритм CUSUM на группу?
Я надеюсь, что это имеет смысл, и любые указатели высоко ценятся! В идеале я ищу решение в Scala и Spark 2.1
Большое спасибо!
1 ответ
После многих исследований Google я нашел решение проблемы с помощью mapPartitions
val dataset = Seq(1.3, 1.8, 0.5, 0.6, 1.2, 1.8).toDS
dataset.repartition(1).mapPartitions(iterator => {
var s = 0.0
val target = 1.0
val w = 0.1
iterator.map(x => {
s = Math.max(0.0, s + x -target - w)
Math.round(10.0 *s)/10.0
})
}).show()
+-----+
|value|
+-----+
| 0.2|
| 0.9|
| 0.3|
| 0.0|
| 0.1|
| 0.8|
+-----+
Я надеюсь, что это сэкономит кому-то время в будущем.