Нахождение среднего значения по ключу с использованием RDD в Spark - PullRequest
0 голосов
/ 18 апреля 2019

Я создал RDD с первым столбцом Key, а остальные столбцы являются значениями этого ключа. Каждый ряд имеет уникальный ключ. Я хочу найти среднее значение для каждого ключа. Я создал пару ключ-значение и попробовал следующий код, но он не дает желаемых результатов. Мой код здесь.

val rows = 10
val cols = 6
val partitions = 4
lazy val li1 = List.fill(rows,cols)(math.random)
lazy val li2 = (1 to rows).toList
lazy val li =  (li1, li2).zipped.map(_ :: _)
val conf = new SparkConf().setAppName("First spark").setMaster("local[*]")
val sc = new SparkContext(conf)
val rdd = sc.parallelize(li,partitions)

val gr = rdd.map( x => (x(0) , x.drop(1)))
val gr1 = gr.values.reduce((x,y) => x.zip(y).map(x => x._1 +x._2 )).foldLeft(0)(_+_)
gr1.take(3).foreach(println)

Я хочу, чтобы результат отображался как

1 => 1.1 ,
2 => 2.7

и так далее для всех ключей

1 Ответ

0 голосов
/ 20 апреля 2019

Сначала я не уверен, что делает эта строка,

lazy val li =  (li1, li2).zipped.map(_ :: _)

Вместо этого вы можете сделать это,

lazy val li =  li2 zip li1

Это создаст список кортежей типа (Int, List [Double]).

И решение для нахождения средних значений по ключам может быть таким, как показано ниже:

rdd.map{ x => (x._1, x._2.fold(0.0)(_ + _)/x._2.length) }.collect.foreach(x => println(x._1+" => "+x._2))
...