添加存在于两个不同RDD中的向量scala spark

时间:2017-03-09 10:08:08

标签: scala apache-spark spark-dataframe

我有两个具有此结构的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]))

2 个答案:

答案 0 :(得分:0)

请使用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(_+_))}

让我们用Array进行实验:)

答案 1 :(得分:0)

您可以在转换中完成所有这些操作代替驱动程序代码。如果你有大的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))))