Spark中的稀疏向量SparseVector类的源码解读

本文详细解读了Scala中SparseVector类的源码,该类在Spark中广泛使用。SparseVector利用索引数组和值数组存储非零元素,减少存储开销。文章介绍了其数据成员、关键方法,如toArray、copy、foreachActive等,并讨论了如何压缩向量及查找最大元素等操作。
首先纠正一下标题,这个类不是spark的源码中的,而是scala的源码中的,但是在spark源码中经常用到它。稀疏向量,底层基于索引数组和值数组共同实现。该类的核心思想是用两个数组,一个记录原始向量中非零元素的值,另一个记录原始向量中非零元素在原始向量中的位置。一共有三个数据成员,size记录原始向量的长度,indices数组为索引数组,values数组为值数组,索引数组和值数组的长度必须一致。注意:一个普通的SparseVector向量和普通向量没有区别,只有在这个向量调用了该类的toSparse方法把向量本身做了压缩之后值数组才只是存储非零元素。下面是该类的源码,我在关键的地方都做了详细注释。

class SparseVector @Since("1.0.0") (
    @Since("1.0.0") override val size: Int,
    @Since("1.0.0") val indices: Array[Int],
    @Since("1.0.0") val values: Array[Double]) extends Vector {

  require(indices.length == values.length, "Sparse vectors require that the dimension of the" +
    s" indices match the dimension of the values. You provided ${indices.length} indices and " +
    s" ${values.length} values.")
  require(indices.length <= size, s"You provided ${indices.length} indices and values, " +
    s"which exceeds the specified vector size ${size}.")

  override def toString: String =
    s"($size,${indices.mkString("[", ",", "]")},${values.mkString("[", ",", "]")})"

  //转化为数组,其中包含所有元素,不是只转化向量中的非零元素
  @Since(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值