首页 > 解决方案 > Scala groupBy 获取 RDD[String, vector]

问题描述

我有一个 RDD [((ID, code),value)]形式的 RDD

示例 RDD:

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

建议?

标签: scalaapache-sparkrdd

解决方案


你快到了——只是缺少map第二个元组元素的内部来组装 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需要一个 Array[Double],因此toArray.


推荐阅读