Scala groupBy, чтобы получить RDD [String, вектор] - PullRequest
0 голосов
/ 01 октября 2018

У меня есть СДР в виде СДР [((ID, код), значение)]

Пример СДР:

((00001, 234) 7.0)
((00001, 456) 6.0)
((00001, 467) 3.0)
((00002, 245) 8.0)
((00002, 765) 9.0)
...

Ожидаемый результат RDD [String, Vectors.dense (...))

Пример:

(00001, vector(7.0, 6.0, 3.0))
(00002, vector(8.0, 9.0))

Я пробовал следующее:

val vectRDD = InRDD.groupBy(f => f._1._1)
  .map(m => (m._1, Vectors.dense(m._2._2)))

Но получите следующую ошибку:

value _2 is not a member of Iterable

Предложения?

1 Ответ

0 голосов
/ 01 октября 2018

Вы почти у цели - просто отсутствует внутренний map из 2-го элемента кортежа для сборки DenseVector:

import org.apache.spark.ml.linalg.Vectors

val rdd = sc.parallelize(Seq(
  (("00001", 234), 7.0),
  (("00001", 456), 6.0),
  (("00001", 467), 3.0),
  (("00002", 245), 8.0),
  (("00002", 765), 9.0)
))

rdd.
  groupBy(_._1._1).
  map(t => (t._1, Vectors.dense(t._2.map(_._2).toArray))).
  collect
// res1: Array[(String, org.apache.spark.ml.linalg.Vector)] =
//   Array((00001,[7.0,6.0,3.0]), (00002,[8.0,9.0]))

Обратите внимание, что Vector.dense принимает массив [Double], следовательно, toArray.

...