Scala,将列表映射到稀疏向量

Scala,将列表映射到稀疏向量,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有一个RDD的 Array[(String, Iterable[(Int, Double)])] 它的元素看起来像 (000267537-01,List((25,0.01), (35,120.0), (26,2.0), (38,130.0), (21,45.0), (54,180.0), (39,10.0))) 现在使用一个常量56,我想将RDD的列表部分转换为稀疏向量。所以我做了: val my_rslt = my_rdd.map(x => (x._1, Vectors.spars

我有一个RDD的

Array[(String, Iterable[(Int, Double)])]
它的元素看起来像

(000267537-01,List((25,0.01), (35,120.0), (26,2.0), (38,130.0), (21,45.0), (54,180.0), (39,10.0)))
现在使用一个常量56,我想将RDD的列表部分转换为稀疏向量。所以我做了:

val my_rslt = my_rdd.map(x => (x._1, Vectors.sparse(56, x._2)))
然后我收到一条错误消息:

<console>:37: error: overloaded method value sparse with alternatives:
  (size: Int,elements: java.lang.Iterable[(Integer, java.lang.Double)])org.apache.spark.mllib.linalg.Vector <and>
  (size: Int,elements: Seq[(Int, scala.Double)])org.apache.spark.mllib.linalg.Vector
 cannot be applied to (Int, Iterable[(Int, scala.Double)])
       val my_rslt = my_rdd.map(x => (x._1, Vectors.sparse(56, x._2)))
                                                    ^
:37:错误:重载的方法值稀疏,带有替代项:
(大小:Int,元素:java.lang.Iterable[(Integer,java.lang.Double)])org.apache.spark.mllib.linalg.Vector
(大小:Int,元素:Seq[(Int,scala.Double)]org.apache.spark.mllib.linalg.Vector
无法应用于(Int,Iterable[(Int,scala.Double)])
val my_rslt=my_rdd.map(x=>(x.\u 1,Vectors.sparse(56,x.\u 2)))
^

那么这里出了什么问题?“向量稀疏”是如何工作的

经过多次尝试,我发现我应该:

val my_rslt = my_rdd.map(x => (x._1, Vectors.sparse(56, x._2.toList)))

尽管我仍然对将“toList”应用于列表的效果感到困惑

也许这个解决方案可以帮助您:
Vectors.sparse(56,my_rdd.flatMap(x=>x.\u 2))
result:
org.apache.spark.mllib.linalg.Vector=(56[21,25,26,35,38,39,54],[45.0,0.01,2.0120.0130.0,10.0180.0])
从错误消息中可以非常清楚地看到
sparse
接受的参数是
Seq[(Int,Double])
Iterable
位于
Seq
之上,因此不能将
Iterable
强制为
Seq
。通过调用
toList()
,您将
Iterable
更改为
列表
,该列表扩展了
Seq
,因此一切正常。由于Spark的Java特定方法在本例中接受Java
Iterable
s,但请记住Scala的
Iterable
Java的
Iterable
,因此消息有点混乱。非常感谢您的解释!