scala - 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
建议?
解决方案
你快到了——只是缺少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
.
推荐阅读
- java - 如何在 Java 中执行 Scala 的 Seq++ 操作数
- ios - Alamofire objectmapper 的 Xcode 10 更新问题
- javascript - 如何在以下代码中添加 Get 或 POST 请求
- go - 参考内部结构
- image - 张量流中的分层图像分类
- python - powershell stderr 重定向每隔几个字符就换行
- rust - 无法在“FnMut”闭包中移出捕获的变量
- arrays - 如何在 C++ 中创建一个添加多个数组的函数
- php - 如何在控制器功能中使用表单输入来输入验证码以保护 CodeIgniter 中的表单提交(不是验证而是验证)
- java - 使用 Streams 的 JsonArray 循环