[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.이것은 실제로 좋은 질문이다. 나는 정기적으로 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.다음 코드는 스파크에서 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")) 할 수 있습니다.
from https://stackoverflow.com/questions/28232829/addition-of-two-rddmllib-linalg-vectors by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 오버 방식과 방법 및 기능 사이 에타 팽창 (0) | 2019.11.12 |
---|---|
[SCALA] 스파크에서 액세스 배열 열 (0) | 2019.11.12 |
[SCALA] 어떻게 쌍 RDD에서 최대 값을 찾는 방법은? (0) | 2019.11.12 |
[SCALA] 스칼라에서 "반환"문의 목적? (0) | 2019.11.12 |
[SCALA] 어떻게 스칼라 스파크에서 엑셀 (XLS, XLSX) 파일에서 Dataframe을 구성하는? (0) | 2019.11.12 |