Scala groupBy 获取 RDD[String, vector]
Posted
技术标签:
【中文标题】Scala groupBy 获取 RDD[String, vector]【英文标题】:Scala groupBy to get a RDD[String, vector] 【发布时间】:2018-10-01 19:25:13 【问题描述】:我有一个格式为 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
建议?
【问题讨论】:
【参考方案1】:你快到了——只是缺少第二个元组元素中的内部 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
。
【讨论】:
Leo C.,再次感谢!我想通了,没有看过这里,但是与您的代码相比,我的代码看起来很难看。一件事,我没有使用收集。 看起来我需要更多的东西来对这里的事情进行投票。试图对这个和你帮助我的另一个投反对票。 @Al.,我运行collect
只是为了显示微小样本数据的结果。通常您不会执行collect
,除非您想将所有数据返回到驱动程序节点。要了解有关collect
的更多信息,请访问SO link。
@Loe C.,感谢您的链接!我怀疑收集与收藏有关。哦,现在可以投票了:)以上是关于Scala groupBy 获取 RDD[String, vector]的主要内容,如果未能解决你的问题,请参考以下文章
Spark/Scala:仅使用 RDD 使用 ReduceByKey 创建嵌套结构
Spark(scala):groupby和聚合值列表到一个基于索引的列表[重复]