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

#scala #apache-spark #rdd

#scala #apache-spark #rdd

Вопрос:

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

 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. Не уверен, что должен делать ваш код. lazy val li = (li1, li2).zipped.map(_ :: _) даже не компилируется. Если вы создаете (ключ, значение) RDD, где значение представляет собой список всех остальных столбцов, что вы подразумеваете под усреднением значений, то есть двух списков?

2. @norbertk lazy val li = (li1, li2).zipped.map(_ :: _) создает новый список, беря первую строку li1 и объединяя ее с li2, поскольку li1 содержит ключи, а li2 содержит значения, и теперь я объединил их в li. Этот li далее передается для создания RDD.

Ответ №1:

Во-первых, я не уверен, что делает эта строка,

 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))
 

Комментарии:

1. lazy val li = (li1, li2).zipped.map(_ :: _) и lazy val li = li2 zip li1 выдают одинаковые выходные данные, и код работает нормально, но производительность снижается, когда эксперименты проводятся с огромным набором данных, предположим, что набор данных содержит 100000 строк и 100 атрибутов.