Итеративная функция 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|
+-----+

Я надеюсь, что это сэкономит кому-то время в будущем.

Другие вопросы по тегам