Здесь на самом деле есть только небольшие синтаксические ошибки:
- Отсутствует запятая между первым и вторым аргументами, передаваемыми в
aggregateByKey
(конец второй строки) - Вы ввели
x._2_.2
вместо x._2._2
Исправление этих данных даст желаемый результат.
НО - Тем не менее, стоит отметить, что Scala предлагает гораздо более приятный синтаксическийварианты работы с кортежами и выполнения простых арифметических операций.Что еще более важно, кортежи не следует использовать слишком часто, и распространенной альтернативой является создание класса case , который лучше поддерживает операции, которые вы пытаетесь выполнить.
Например, мыможет создать простой Stats
класс case, который имеет метод agg
:
case class Stats(total: Float, min: Float, max: Float) {
def agg(other: Stats): Stats = Stats(
total + other.total,
math.min(min, other.min),
math.max(max, other.max)
)
}
и затем использовать reduceByKey
с этой функцией:
val result: RDD[(Int, Stats)] = forditems
.map(_.split(",")).map(arr => (arr(1).toInt, arr(4).toFloat))
.mapValues(f => Stats(f, f, f))
.reduceByKey(_ agg _)
Более того, если вы 'готов использовать Spark DateFrames - это становится еще проще:
import org.apache.spark.sql.functions._
import spark.implicits._
val df = forditems.map(_.split(",")).map(arr => (arr(1).toInt, arr(4).toFloat)).toDF("k", "v")
val resultDf = df.groupBy("k").agg(sum($"v"), min($"v"), max($"v"))
resultDf.show()
// +---+------+------+------+
// | k|sum(v)|min(v)|max(v)|
// +---+------+------+------+
// | 1| 444.0| 4.0| 400.0|
// +---+------+------+------+