복붙노트

[SCALA] 두 RDD [mllib.linalg.Vector]의 첨가

SCALA

두 RDD [mllib.linalg.Vector]의 첨가

나는 두 개의 파일에 저장되어있는 두 개의 행렬의 추가가 필요합니다.

latest2.txt latest1.txt과의 내용은 다음 STR있다 :

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]을 추가 아파치 스파크에이야 어떤 방법이 있습니까.

해결법

  1. ==============================

    1.이것은 실제로 좋은 질문이다. 나는 정기적으로 mllib 작업과 이러한 기본 선형 대수 연산이 쉽게 접근 할 수없는 몰랐어요.

    이것은 실제로 좋은 질문이다. 나는 정기적으로 mllib 작업과 이러한 기본 선형 대수 연산이 쉽게 접근 할 수없는 몰랐어요.

    특별히 언급 한 것을 물론 기본 요소 현명한 추가로 포함 - 요점은 기본 바람 벡터가 당신이 기대 선형 대수학 조작을 모두 가지고있다.

    그러나 바람 구현은 외부 세계를 통해, 숨겨진 :

    [private mllib]
    

    그럼, 외부 세계 / 공개 API의 관점에서, 우리는 어떻게 그 프리미티브를 액세스합니까?

    그들 중 일부는 이미 노출되어있다 : 예를 들면, 제곱의 합:

    /**
     * Returns the squared distance between two Vectors.
     * @param v1 first Vector.
     * @param v2 second Vector.
     * @return squared distance between two Vectors.
     */
    def sqdist(v1: Vector, v2: Vector): Double = { 
      ...
    }
    

    그러나 이러한 가능한 방법의 선택은 제한된다 - 실제로 소자 등 현명한 덧셈, 뺄셈, 곱셈을 포함하여 기본 동작을 포함하지 않는다

    그래서 여기 내가 볼 수있는 최선입니다 :

    여기에 몇 가지 예제 코드는 다음과 같습니다

    val v1 = Vectors.dense(1.0, 2.0, 3.0)
    val v2 = Vectors.dense(4.0, 5.0, 6.0)
    val bv1 = new DenseVector(v1.toArray)
    val bv2 = new DenseVector(v2.toArray)
    
    val vectout = Vectors.dense((bv1 + bv2).toArray)
    vectout: org.apache.spark.mllib.linalg.Vector = [5.0,7.0,9.0]
    
  2. ==============================

    2.다음 코드는 스파크에서 asBreeze 및 fromBreeze 방법을 제공합니다. 이 용액을 사용 vector.toArray 대조적 스파 스 벡터를 지원한다. 스파크는 이미 미래에 자신의 API를 변경하고 수 있음을 참고 asBreeze에 toBreeze 이름을 변경했다.

    다음 코드는 스파크에서 asBreeze 및 fromBreeze 방법을 제공합니다. 이 용액을 사용 vector.toArray 대조적 스파 스 벡터를 지원한다. 스파크는 이미 미래에 자신의 API를 변경하고 수 있음을 참고 asBreeze에 toBreeze 이름을 변경했다.

    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")) 할 수 있습니다.

  3. from https://stackoverflow.com/questions/28232829/addition-of-two-rddmllib-linalg-vectors by cc-by-sa and MIT license