Итак, я новичок в Scala и только начинаю работать с RDD и функциональными операциями Scala.
Я пытаюсь перебрать значения моих парных RDD и вернуть Var1
со средним значением значений, хранящихся в Var2
, применяя определенную функцию average
, чтобы окончательный результат представлял собой уникальный список Var1 с одним AvgVar2
, связанным с каждым. У меня много проблем с выяснением того, как перебирать значения.
* редактировать: у меня есть следующие объявления типов:
case class ID: Int, Var1: Int, Var2: Int extends Serializable
У меня есть следующая функция:
def foo(rdds: RDD[(ID, Iterable[(Var1, Var2)])]): RDD[(Var1, AvgVar2)] = {
def average(as: Array[Var2]): AvgVar2 = {
var sum = 0.0
var i = 0.0
while (i < as.length) {
sum += Var2.val
i += 1
}
sum/i
}
//My attempt at Scala
rdds.map(x=> ((x._1),x._2)).groupByKey().map(x=>average(x._1)).collect()
}
Моя попытка Scala пытается сделать следующее:
- разделите пару RDD Iterable на пары ключ-значение
Var1-Var2
. - Сгруппируйте по ключу
Var1
и создайте массив связанныхVar2
. - Примените мою функцию
average
к каждому массивуVar2
- Верните
AvgVar2
со связаннымVar1
в виде набора RDD.
*Редактировать:
Некоторые примеры входных данных для rdds
:
//RDD[(ID,Iterable[(Var1,Var2)...])]
RDD[(1,[(1,3),(1,12),(1,6)])],
RDD[(2,[(2,5),(2,7)])]
Некоторые примеры выходных данных:
//RDD[(Var1, AvgVar2)]
RDD[(1,7),(2,6)]
*Редактировать: Строка рабочего кода Scala:
rdd.map(x => (x._2.map(it => it._1).asInstanceOf[Var1], average(x._2.map(it => it._2).toArray)))
Var1
встречаться в разныхID
? - person vdep   schedule 01.02.2019Var1
может быть связано только с одним идентификатором, но я хочу удалить идентификатор в возвращаемом RDD. Я добавил образцы входных и выходных данных в свое редактирование, которые, я надеюсь, прояснят вопрос. - person EliSquared   schedule 01.02.2019