Scala Карта искр по парам элементов RDD - PullRequest
0 голосов
/ 15 января 2020

Какова лучшая практика, чтобы перебирать RDD в Spark, получая как предыдущий, так и текущий элемент? То же, что и функция reduce, но возвращает и RDD вместо одного значения.

Например, задано:

val rdd = spark.sparkContext.textFile("date_values.txt").
          map {
             case Array(val1, val2, val3) =>
                Element(DateTime.parse(val1), val2.toDouble)
          }

Выход должен быть новым RDD с разницей в val2 Атрибуты:

Diff(date, current.val2 - previous.val2)

С помощью функции map я могу получить только текущий элемент, а с помощью функции reduce я могу вернуть только 1 элемент, а не СДР. Я мог бы использовать функцию foreach, сохраняя во временных переменных предыдущее значение, но я не думаю, что это будет соответствовать рекомендациям Scala -Spark.

Как вы думаете, что является наиболее подходящим способом справиться с этим?

1 Ответ

0 голосов
/ 15 января 2020

Ответ, данный Domini c Эггер в этой теме - это то, что я искал:

Spark находит предыдущее значение на каждой итерации RDD

import org.apache.spark.mllib.rdd.RDDFunctions._
sortedRDD.sliding(2)

или с помощью API разработчика:

val l = sortedRdd.zipWithIndex.map(kv => (kv._2, kv._1))
val r = sortedRdd.zipWithIndex.map(kv => (kv._2-1, kv._1))
val sliding = l.join(r)
...