#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 атрибутов.