Spark-MLlib基础数据类型

MLlib基础数据类型

多种数据类型

类型名称释义
Local vector本地向量集。主要向Spark提供一组可进行操作的数据集合
Labeled point向量标签。让用户能够分类不同的数据集合
Local matrix本地矩阵。将数据集合以矩阵形式存储在本地计算机中
Distributed matrix分布式矩阵。将数据集合以矩阵形式存储在分布式计算机中

本地向量集

本地向量集分为稀疏型数据集和密集型数据集。密集型数据集会将数据集作为一个集合的形式整体存储,稀疏型数据集将数据集按照数据集的大小,数据的下标,数据集本身存储。如果存入一个数据集(9,5,2,7),密集型数据集会存储为(9,5,2,7),稀疏型数据集会存储为(4,(1,2,3,4),(9,5,2,7))。

代码示例如下:

import org.apache.spark.mllib.linalg.{Vector,Vectors}
object testVector {
  def main(args: Array[String]): Unit = {
    //建立密集向量
    val vd = Vectors.dense(9,5,2,7)
    //打印稀疏向量
    println(vd)
    //建立稀疏向量
    val vs = Vectors.sparse(4,Array(0,1,2,3),Array(9,5,2,7))
    //打印稀疏向量
    println(vs)
  }
}

----------
[9.0,5.0,2.0,7.0]
(4,[0,1,2,3],[9.0,5.0,2.0,7.0])

向量标签

向量标签用于对MLlib中的不同值做标记,可以将不同的数据集分为若干份并进行标记。

import org.apache.spark.mllib.linalg.{Vector,Vectors}
import org.apache.spark.mllib.regression.LabeledPoint

object testLabeledPoint{
    def main(args: Array[String]): Unit = {
        // 建立密集向量
        val vd = Vectors.dense(9,5,2,7)
        // 对密集向量建立标记点
        val pos = LabeledPoint(1,vd)
        // 打印标记点内容数据
        println(pos.features)
        // 打印既定标记
        println(pos.label)
        // 建立稀疏向量
        val vs = Vectors.sparse(4,Array(0,1,2,3),Array(9,5,2,7))
        // 对稀疏向量建立标记点
        val neg = LabeledPoint(2,vs)
        // 打印标记点内容数据
        println(neg.features)
        // 打印既定标记
        println(neg.label)

        println(neg)
    }
}

----------
[9.0,5.0,2.0,7.0]
1.0
(4,[0,1,2,3],[9.0,5.0,2.0,7.0])
2.0
(2.0,(4,[0,1,2,3],[9.0,5.0,2.0,7.0]))

向量标签也可以通过读取固定格式的数据集来产生建立向量标签:

文件内容:

1 1:2 2:3 3:3
2 1:5 2:8 3:9
1 1:7 2:6 3:7
1 1:3 2:2 3:1

注:这是LibSVM文件格式,通用格式为:行号 索引号:值 索引从1开始
import org.apache.spark.mllib.linalg.{Vector,Vectors}
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark._
import org.apache.spark.mllib.util.MLUtils

object testLabeledPoint2{
    def main(args:Array[String]){
        val conf = new SparkConf() //建立本地环境变量
            .setMaster("local")
            .setAppName("testLabeledPoint2")
        val sc = new SparkContext(conf)

        val mu = MLUtils.loadLibSVMFile(sc,"E:\\a.txt")
        mu.foreach(println)
    }
}

----------
(1.0,(3,[0,1,2],[2.0,3.0,3.0]))
(2.0,(3,[0,1,2],[5.0,8.0,9.0]))
(1.0,(3,[0,1,2],[7.0,6.0,7.0]))
(1.0,(3,[0,1,2],[3.0,2.0,1.0]))

本地矩阵

为了更多更快的使用矩阵运算进行数据处理,本地矩阵是很好的存储方法。

import org.apache.spark.mllib.linalg.{Matrix,Matrices}

object testMatrix {
    def main(args: Array[String]): Unit = {
        val mx = Matrices.dense(2,3,Array(1,2,3,4,5,6)) //创建一个两行三列的矩阵,矩阵内容为123456
        println(mx)
    }
}
----------
1.0  3.0  5.0  
2.0  4.0  6.0  

分布式矩阵

一般来说分布式矩阵用来存储数据量非常大的数据集,其处理速度和效率与其存储格式息息相关。分布式矩阵有:行矩阵,带索引的行矩阵,坐标矩阵和块矩阵,主要看前三个格式。

行矩阵

行矩阵是最基本的一种矩阵类型。行矩阵是以行为基本方向的矩阵存储格式。

文件内容:

1 2 3
4 5 6
import org.apache.spark._
import org.apache.spark.mllib.linalg.{Vector,Vectors}
import org.apache.spark.mllib.linalg.distributed.RowMatrix

object testRowMatrix {
    def main(args: Array[String]): Unit = {
        val  conf = new SparkConf()
            .setMaster("local")
            .setAppName("testRowMatrix")
        val sc = new SparkContext(conf)
        val rdd = sc.textFile("E:\\a.txt")
            .map(_.split(" ")
            .map(_.toDouble))
            .map(line => Vectors.dense(line))
        val rm = new RowMatrix(rdd)
        println(rm.numRows())
        println(rm.numCols())
    }
}
----------
2
3
带索引的行矩阵

行矩阵无法对内容直接显示,但是为了方便调试,可以使用带索引的行矩阵。

import org.apache.spark._
import org.apache.spark.mllib.linalg.distributed.{IndexedRow,RowMatrix,IndexedRowMatrix}
import org.apache.spark.mllib.linalg.{Vectors,Vector}
object testIndexedRowMatrix {
    def main(args: Array[String]): Unit = {
        // 创建conf
        val conf = new SparkConf()
            .setMaster("local")
            .setAppName("testIndexecRowMatrix")
        // 实例化环境变量
        val sc = new SparkContext(conf)
        // 创建RDD文件路径
        val rdd = sc.textFile("e://a.txt")
            .map(_.split(" ")
            .map(_.toDouble))
            .map(line => Vectors.dense(line))          // 转化成向量存储
            .map((vd) => new IndexedRow(vd.size,vd))   // 转化格式
        val irm = new IndexedRowMatrix(rdd)
        println(irm.getClass)
        println(irm.rows.foreach(println))
    }
}

----------
class org.apache.spark.mllib.linalg.distributed.IndexedRowMatrix
IndexedRow(3,[1.0,2.0,3.0])
IndexedRow(3,[4.0,5.0,6.0])
坐标矩阵

坐标矩阵就是在带行索引的行矩阵上再加一个列索引。

import org.apache.spark._
import org.apache.spark.mllib.linalg.{Vector,Vectors}
import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix,MatrixEntry}
object testCoordinateRowMatrix {
    def main(args: Array[String]): Unit = {
        // 创建conf
        val conf = new SparkConf()
            .setMaster("local")
            .setAppName("testCoordinateRowMatrix")
        // 实例化环境变量
        val sc = new SparkContext(conf)
        // 创建RDD文件路径
        val rdd = sc.textFile("e://a.txt")
            .map(_.split(" ")
            .map(_.toDouble))
            // 转化成坐标格式
            .map(vue => (vue(0).toLong,vue(1).toLong,vue(2)))     
            // 转化成坐标矩阵格式
            .map(vue2 => new MatrixEntry(vue2 _1,vue2 _2,vue2 _3)) 
        val crm = new CoordinateMatrix(rdd)
        println(crm.entries.foreach(println))
    }
}

----------
MatrixEntry(1,2,3.0)
MatrixEntry(4,5,6.0)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒 暄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值