簡體   English   中英

添加存在於兩個不同RDD中的向量scala spark

[英]Adding vectors present in two different RDDs scala spark

我有兩個這種結構的RDD

org.apache.spark.rdd.RDD[(Long, org.apache.spark.mllib.linalg.Vector)]

這里RDD的每一行都包含一個索引Long和一個矢量org.apache.spark.mllib.linalg.Vector 我想將Vector每個組件添加到其他RDD行中存在的其他Vector的相應組件中。 應將第一個RDD的每個向量添加到其他RDD的每個向量中。

一個例子看起來像這樣:

RDD1集:

Array[(Long, org.apache.spark.mllib.linalg.Vector)] = 
      Array((0,[0.1,0.2]),(1,[0.3,0.4]))

RDD2:

Array[(Long, org.apache.spark.mllib.linalg.Vector)] = 
      Array((0,[0.3,0.8]),(1,[0.2,0.7]))

結果:

Array[(Long, org.apache.spark.mllib.linalg.Vector)] = 
Array((0,[0.4,1.0]),(0,[0.3,0.9]),(1,[0.6,1.2]),(1,[0.5,1.1]))

請使用List而不是Array來考慮相同的情況。

這是我的解決方案:

    val l1 = List((0,List(0.1,0.2)),(1,List(0.1,0.2)))
    val l2 = List((0,List(0.3,0.8)),(1,List(0.2,0.7)))
    var sms = (l1 zip l2).map{ case (m, a) => (m._1, (m._2, a._2).zipped.map(_+_))}

讓我們試試數組:)

而不是驅動程序代碼,您可以在轉換中完成所有這些。 如果你有大的rdds,這將有所幫助。 這也將減少洗牌次數。

val a:RDD[(Long, org.apache.spark.mllib.linalg.Vector)]= sc.parallelize(Array((0l,Vectors.dense(0.1,0.2)),(1l,Vectors.dense(0.3,0.4))))

val b:RDD[(Long, org.apache.spark.mllib.linalg.Vector)]= sc.parallelize(Array((0l,Vectors.dense(0.3,0.8)),(1l,Vectors.dense(0.2,0.7))))

val ab= a join b

val result=ab.map(x => (x._1,Vectors.dense(x._2._1.apply(0)+x._2._2.apply(0),x._2._1.apply(1)+x._2._2.apply(1))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM