14

2 つのファイルに格納されている 2 つの行列を追加する必要があります。

latest1.txtandのコンテンツにlatest2.txtは次の文字列があります。

1 2 3
4 5 6
7 8 9

私は次のようにこれらのファイルを読んでいます:

scala> val rows = sc.textFile(“latest1.txt”).map { line => val values = line.split(‘ ‘).map(_.toDouble)
    Vectors.sparse(values.length,values.zipWithIndex.map(e => (e._2, e._1)).filter(_._2 != 0.0))
}

scala> val r1 = rows
r1: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MappedRDD[2] at map at :14

scala> val rows = sc.textFile(“latest2.txt”).map { line => val values = line.split(‘ ‘).map(_.toDouble)
    Vectors.sparse(values.length,values.zipWithIndex.map(e => (e._2, e._1)).filter(_._2 != 0.0))
}

scala> val r2 = rows
r2: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MappedRDD[2] at map at :14

r1、r2を追加したい。RDD[mllib.linalg.Vector]それで、 Apache-Spark でこの 2 つの s を追加する方法はありますか。

4

2 に答える 2

3

次のコードは、Spark から asBreeze および fromBreeze メソッドを公開します。このソリューションはSparseVector、を使用するのとは対照的にサポートしvector.toArrayます。Spark は将来 API を変更する可能性があり、既に名前が に変更されていることに注意してtoBreezeくださいasBreeze

package org.apache.spark.mllib.linalg
import breeze.linalg.{Vector => BV}
import org.apache.spark.sql.functions.udf

/** expose vector.toBreeze and Vectors.fromBreeze
  */
object VectorUtils {

  def fromBreeze(breezeVector: BV[Double]): Vector = {
    Vectors.fromBreeze( breezeVector )
  }

  def asBreeze(vector: Vector): BV[Double] = {
    // this is vector.asBreeze in Spark 2.0
    vector.toBreeze
  }

  val addVectors = udf {
    (v1: Vector, v2: Vector) => fromBreeze( asBreeze(v1) + asBreeze(v2) )
  }

}

これでできますdf.withColumn("xy", addVectors($"x", $"y"))

于 2016-12-13T08:20:43.200 に答える