spark mlib 機器學習系列之二:spark mlib 基本數據類型的使用

spark mlib 基本數據類型

Local Vector 本地向量集,向spark 提供一組可操作的數據集合
Labeled point 向量標籤,讓用戶分類不同的數據集合。
Local Matrix 本地矩陣, 將數據集合以矩陣的形式存儲在本地集合中。
Distributed Matrix 分佈式矩陣,將數據以矩陣形式存儲在分佈式計算機中。
(分佈式行矩陣,帶標籤分佈式行矩陣,分佈式座標矩陣)

package mlib

import org.apache.spark.ml.feature.LabeledPoint
import org.apache.spark.ml.linalg.{Matrices, Vector, Vectors}
import org.apache.spark.mllib.linalg.distributed._
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.sql.SparkSession

object MlibDataTypeExample {
    def main(args: Array[String]): Unit = {
        // Local Vector  僅支持整型和float 數字, 密集型向量和稀疏型向量
        val vd : Vector = Vectors.dense(2, 0, 6)
        println(vd + ": " + vd(2))  // 結果[2.0,0.0,6.0]: 6.0
        val vs : Vector = Vectors.sparse(4, Array(0, 1, 2, 3), Array(9, 5, 2, 7))
        println(vs + ": " + vs(0))  // 結果(4,[0,1,2,3],[9.0,5.0,2.0,7.0]): 9.0
        val vdDemo : Vector = Vectors.dense('2', '0', 'h')

        // LabelPoint 的使用
        println("------------------LabeledPoint--------------------")
        val vd03 = Vectors.dense(3, 4, 5)
        val pos01 = LabeledPoint(1, vd03)
        println(pos01.label)   
        println(pos01.features)
        //1.0
        //[3.0,4.0,5.0]

        val vd04 = Vectors.sparse(3, Array(0, 1, 2), Array(2.3, 3.4, 5.6))
        val pos02 = LabeledPoint(2, vd04)
        println(pos02.label)
        println(pos02.features)
        //2.0
        //(3,[0,1,2],[2.3,3.4,5.6])

        // 本地矩陣用法
        // 個數需要匹配上,否則會報錯
        val mx  = Matrices.dense(2,3, Array(1,2,3,4,5,6))
        println("-------------本地矩陣---------------")
        println(mx)
        //1.0  3.0  5.0  
        //2.0  4.0  6.0 


        val spark = SparkSession
            .builder
            .master("local[*]")
            .appName("UseFulRddOpts")
            .getOrCreate()
        val sc = spark.sparkContext

        println("-----------從數據庫或者文件中加載數據---------")
        println("-----------文件中的數據的小標需要從1開始---------")
        // 從數據庫或者外部數據集進行加載
        val mu = MLUtils.loadLibSVMFile(sc,
            "file:/D:/DevDir/Conclusions/SparkMlib/src/main/resources/a.txt")
        // a.txt
        //1 1:1 2:2 3:3
        //2 1:90 2:-9 3:9
        //1 1:3 2:8 3:4
        //2 1:1 2:7 3:2
        mu.foreach(println)
        //(1.0,(3,[0,1,2],[3.0,8.0,4.0]))
        //(1.0,(3,[0,1,2],[1.0,2.0,3.0]))
        //(2.0,(3,[0,1,2],[1.0,7.0,2.0]))
        //(2.0,(3,[0,1,2],[90.0,-9.0,9.0]))



        // 分佈式行矩陣的用法
        val rdd = sc.textFile("file:/D:/DevDir/Conclusions/SparkMlib/src/main/resources/b.txt")
        // b.txt
        //1 2 3
        //4 5 6
        val rdd2 = rdd.map(_.split(" "))
        rdd2.foreach(a => {println(a(0) + " : " + a(1) + " : "  + a(2))})
        //1 : 2 : 3
        //4 : 5 : 6

        val rdd3 = rdd2.map(line => {
            val arr = Array(line(0).toDouble, line(1).toDouble, line(2).toDouble)
            org.apache.spark.mllib.linalg.Vectors.dense(arr)})
        val matrix = new RowMatrix(rdd3)
        println(matrix.numCols)   // 代表列 3
        println(matrix.numRows)    // 代表行 2

        // 帶有行標籤的分佈式行行矩陣
        val rdd4 = rdd3.map(vd => new IndexedRow(vd.size, vd))
        val irm = new IndexedRowMatrix(rdd4)
        println(irm.getClass)
        irm.rows.foreach(println)
        // 結果
        //IndexedRow(3,[4.0,5.0,6.0])
        //IndexedRow(3,[1.0,2.0,3.0])

        // 分佈式座標矩陣
        val rdd5 = rdd2.map(line => {
            new MatrixEntry(line(0).toLong, line(1).toLong, line(2).toDouble)
        })

        val crm = new CoordinateMatrix(rdd5)
        crm.entries.foreach(println)
        //MatrixEntry(4,5,6.0)
        //MatrixEntry(1,2,3.0)

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章