关于SparkMLlib的基础数据结构Spark-MLlib-Basics
此部分主要關于MLlib的基礎數據結構
1、本地向量
MLlib的本地向量主要分為兩種,DenseVector和SparseVector,顧名思義,前者是用來保存稠密向量,后者是用來保存稀疏向量,其創建方式主要有一下三種(三種方式均創建了向量(1.0, 0.0, 2.0):
import org.apache.spark.mllib.linalg.{Vector, Vectors}
//創建一個稠密向量
val dv : Vector = Vector.dense(1.0,0.0,3.0);
//創建一個稀疏向量(第一種方式)
val sv1: Vector = Vector.sparse(3, Array(0,2), Array(1.0,3.0));
//創建一個稀疏向量(第二種方式)
val sv2 : Vector = Vector.sparse(3, Seq((0,1.0),(2,3.0)))
對于稠密向量:很直觀,你要創建什么,就加入什么,其函數聲明為Vector.dense(values : Array[Double])
對于稀疏向量,當采用第一種方式時,3表示此向量的長度,第一個Array(0,2)表示的索引,第二個Array(1.0, 3.0)與前面的Array(0,2)是相互對應的,表示第0個位置的值為1.0,第2個位置的值為3
對于稀疏向量,當采用第二種方式時,3表示此向量的長度,后面的比較直觀,Seq里面每一對都是(索引,值)的形式。
?
tips:由于scala中會默認包含scal.collection.immutalbe.Vector,所以當使用MLlib中的Vector時,需要顯式的指明import路徑
2、向量標簽
向量標簽和向量是一起的,簡單來說,可以理解為一個向量對應的一個特殊值,這個值的具體內容可以由用戶指定,比如你開發了一個算法A,這個算法對每個向量處理之后會得出一個特殊的標記值p,你就可以把p作為向量標簽。同樣的,更為直觀的話,你可以把向量標簽作為行索引,從而用多個本地向量構成一個矩陣(當然,MLlib中已經實現了多種矩陣)
其使用代碼為:
import org.apache.spark.mllib.linag.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))
對于pos變量,第一個參數1.0的具體含義只有你自己知道咯,可以使行索引,可以使特殊值神馬的
從文件中直接讀入一個LabeledPoint
MLlib提供了一種快捷的方法,可以讓用戶直接從文件中讀取LabeledPoint格式的數據。規定其輸入文件的格式為:
label index1:value1 index2:value2.....然后通過
val test : RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "path")直接讀入即可。
3、本地矩陣
既然是算數運算包,肯定少不了矩陣包,先上代碼:
import org.apache.spark.mllib.linalg.{Matrix, Matrices}
val dm : Matrix = Matrices.dense(3,2, Array(1.0,3.0,5.0,2.0,4.0,6.0))
上面的代碼段創建了一個稠密矩陣:
| 1.0 | 2.0 |
| 3.0 | 4.0 |
| 5.0 | 6.0 |
很明顯,創建的時候是將原來的矩陣按照列變成一個一維矩陣之后再初始化的。
tips:注意,我們創建的是稠密矩陣,不幸的事,MLlib中并沒有提供稀疏矩陣的實現,官方說在后續版本中會提供。
4、分布式矩陣
MLlib提供了三種分布式矩陣的實現,依據你數據的不同的特點,你可以選擇不同類型的數據:
a、RowMatrix
RowMatrix矩陣只是將矩陣存儲起來,要注意的是,此種矩陣不能按照行號訪問。(我也不知道為什么這樣鳥。。)
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.linalg.distributed.RowMatrix
val rows: RDD[Vector] = ...//
val mat: RowMatrix = new RowMatrix(rows)
val m = mat.numRows()
val n = mat.numCols()
RowMatrix要從RDD[Vector]構造,m是mat的行數,n是mat的列
Multivariate summary statistics
顧名思義,這個類里面包含了矩陣中的很多常見信息,怎么使用呢?
import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.distributed.RowMatrix
import org.apache.spark.mllib.stat.MultivariateStatisticalSummary
val mat: RowMatrix = ..
val summy : MultivariateStatisticalSummary = mat.computeColumnSummaryStatistics()
println(summy.mean)//平均數
通過這個類,可以得到平均數,矩陣中非0個數,具體的數據看看幫助文檔
b、IndexedRowMatrix
IndexedRowMatrix矩陣和RowMatrix矩陣的不同之處在于,你可以通過索引值來訪問每一行。其他的,沒啥區別。。
c、CoordinateMatrix
當你的數據特別稀疏的時候怎么辦?采用這種矩陣吧。先上代碼:
import org.apache.spark.mllib.linalg.distributed.{CoordinatedMatrix, MatrixEntry}
val entries : RDD[MatrixEntry] = ..
val mat: CoordinateMatrix = new CoordinateMatrix(entries)
CoordinateMatrix矩陣中的存儲形式是(row,col,value),就是原始的最稀疏的方式,所以如果矩陣比較稠密,別用這種數據格式
總結
以上是生活随笔為你收集整理的关于SparkMLlib的基础数据结构Spark-MLlib-Basics的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spark出现task不能序列化错误的解
- 下一篇: Spark基本操作SparkSessio