在星火简单的矩阵乘法 [英] simple matrix multiplication in Spark

查看:195
本文介绍了在星火简单的矩阵乘法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些非常基本的火花code挣扎。我想定义一个矩阵 X 2列。这是我曾尝试:

 斯卡拉> VAL S = breeze.linalg.linspace(-3,3,5-三)
小号:breeze.linalg.DenseVector [双] = DenseVector(-3.0,-1.5,0.0,1.5,3.0)//在这种情况下,我想s到既列1和x 2列斯卡拉> VAL SS = s.toArray ++ s.toArray
SS:数组[双] =阵列(-3.0,-1.5,0.0,1.5,3.0,-3.0,-1.5,0.0,1.5,3.0)斯卡拉>进口org.apache.spark.mllib.linalg.distributed.RowMatrix
进口org.apache.spark.mllib.linalg.distributed.RowMatrix斯卡拉> VAL垫=新RowMatrix(SS,5,2)
<&控制台GT;:17:错误:类型不匹配;
 发现:数组[双]
 要求:org.apache.spark.rdd.RDD [org.apache.spark.mllib.linalg.Vector]
       VAL垫=新RowMatrix(SS,5,2)

我不明白我怎么能得到正确的改造,以便将值传递到分布式矩阵^

编辑:
也许我已经能够解决:

 斯卡拉> VAL S = breeze.linalg.linspace(-3,3,5-三)
小号:breeze.linalg.DenseVector [双] = DenseVector(-3.0,-1.5,0.0,1.5,3.0)斯卡拉> VAL SS = s.to
的toArray toDenseMatrix toDenseVector toScalaVector的toString
toVector斯卡拉> VAL SS = s.toArray ++ s.toArray
SS:数组[双] =阵列(-3.0,-1.5,0.0,1.5,3.0,-3.0,-1.5,0.0,1.5,3.0)斯卡拉> VAL X =新breeze.linalg.Dense
DenseMatrix DenseVector斯卡拉> VAL X =新breeze.linalg.DenseMatrix(5,2,SS)
X:breeze.linalg.DenseMatrix [双] =
-3.0 -3.0
-1.5 -1.5
0.0 0.0
1.5 1.5
3.0 3.0斯卡拉> VAL xDist = sc.parallelize(x.toArray)
xDist:org.apache.spark.rdd.RDD [双] = ParallelCollectionRDD [0]并行化AT<&控制台GT;:18


解决方案

这样的事情。这typechecks,但由于某种原因不能在我的斯卡拉工作运行。

 进口org.apache.spark.mllib.linalg._
进口org.apache.spark.mllib.linalg.distributed._
进口org.apache.spark.SparkContext
进口org.apache.spark.SparkContext._
进口org.apache.spark.SparkConf
进口org.apache.spark.rdd.RDDVAL的conf =新SparkConf()。setAppName(火花从零开始)。setMaster(本地)
VAL SC =新SparkContext(CONF)//值的每一行中的列
VAL COL =名单(-3.0,-1.5,0.0,1.5,3.0);//使列值的两排,转吧,
//使结果的矢量
VAL T =名单(COL,COL).transpose.map(R = GT; Vectors.dense(r.toArray))//载体的产生顺序做出RDD,和
//使从一个RowMatrix。
VAL RM =新RowMatrix(sc.makeRDD(T));

I am struggling with some very basic spark code. I would like to define a matrix x with 2 columns. This is what I have tried:

scala> val s = breeze.linalg.linspace(-3,3,5)
s: breeze.linalg.DenseVector[Double] = DenseVector(-3.0, -1.5, 0.0, 1.5, 3.0) // in this case I want s to be both column 1 and column 2 of x

scala> val ss = s.toArray ++ s.toArray
ss: Array[Double] = Array(-3.0, -1.5, 0.0, 1.5, 3.0, -3.0, -1.5, 0.0, 1.5, 3.0)

scala> import org.apache.spark.mllib.linalg.distributed.RowMatrix
import org.apache.spark.mllib.linalg.distributed.RowMatrix

scala> val mat = new RowMatrix(ss, 5, 2)
<console>:17: error: type mismatch;
 found   : Array[Double]
 required: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector]
       val mat = new RowMatrix(ss, 5, 2)

I do not understand how I can get the right transformation in order to pass the values to the distributed matrix ^

EDIT: Maybe I have been able to solve:

scala> val s = breeze.linalg.linspace(-3,3,5)
s: breeze.linalg.DenseVector[Double] = DenseVector(-3.0, -1.5, 0.0, 1.5, 3.0)

scala> val ss = s.to
toArray         toDenseMatrix   toDenseVector   toScalaVector   toString        
toVector        

scala> val ss = s.toArray ++ s.toArray
ss: Array[Double] = Array(-3.0, -1.5, 0.0, 1.5, 3.0, -3.0, -1.5, 0.0, 1.5, 3.0)

scala> val x = new breeze.linalg.Dense
DenseMatrix   DenseVector   

scala> val x = new breeze.linalg.DenseMatrix(5, 2, ss)
x: breeze.linalg.DenseMatrix[Double] = 
-3.0  -3.0  
-1.5  -1.5  
0.0   0.0   
1.5   1.5   
3.0   3.0   

scala> val xDist = sc.parallelize(x.toArray)
xDist: org.apache.spark.rdd.RDD[Double] = ParallelCollectionRDD[0] at parallelize at <console>:18

解决方案

Something like this. This typechecks, but for some reason won't run in my Scala worksheet.

import org.apache.spark.mllib.linalg._
import org.apache.spark.mllib.linalg.distributed._
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD

val conf = new SparkConf().setAppName("spark-scratch").setMaster("local")
val sc= new SparkContext(conf)

// the values for the column in each row
val col = List(-3.0, -1.5, 0.0, 1.5, 3.0) ;

// make two rows of the column values, transpose it,
// make Vectors of the result
val t = List(col,col).transpose.map(r=>Vectors.dense(r.toArray))

// make an RDD from the resultant sequence of Vectors, and 
// make a RowMatrix from that.
val rm = new RowMatrix(sc.makeRDD(t));

这篇关于在星火简单的矩阵乘法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆