从Scipy稀疏矩阵创建稀疏RDD

3
我有一个来自Scipy的大型稀疏矩阵(300k x 100k,所有值都是二进制的,大多数为零)。我想将这个矩阵的行设置为RDD,然后对这些行进行一些计算 - 在每行上评估函数,在一对行上评估函数等等。
关键是它非常稀疏,我不想使集群崩溃 - 我可以将行转换为SparseVectors吗?或者将整个矩阵转换为SparseMatrix?
您能否举例说明如何读取稀疏数组,将行设置为RDD,并从这些行的笛卡尔积中计算某些内容?

尝试使用pyspark - Eli Sadoff
@EliSadoff,我正在使用pyspark,问题是我不知道要使用哪些对象或如何设置它们。 - cgreen
啊,我没意识到。我以为你在想办法将它从Python转换到Scala。 - Eli Sadoff
2个回答

5
最近我遇到了这个问题——我认为你可以通过使用scipy csc_matrix属性来直接构建SparseMatrix。(借用自Yang Bryan的方法)
import numpy as np
import scipy.sparse as sps
from pyspark.mllib.linalg import Matrices

# create a sparse matrix
row = np.array([0, 2, 2, 0, 1, 2])
col = np.array([0, 0, 1, 2, 2, 2])
data = np.array([1, 2, 3, 4, 5, 6]) 
sv = sps.csc_matrix((data, (row, col)), shape=(3, 3))

# convert to pyspark SparseMatrix
sparse_matrix = Matrices.sparse(sv.shape[0],sv.shape[1],sv.indptr,sv.indices,sv.data)

2

你需要做的唯一一件事就是 toarray() 方法

import numpy as np
import scipy.sparse as sps

# create a sparse matrix
row = np.array([0, 2, 2, 0, 1, 2])
col = np.array([0, 0, 1, 2, 2, 2])
data = np.array([1, 2, 3, 4, 5, 6]) 
sv = sps.csc_matrix((data, (row, col)), shape=(3, 3))
sv.toarray()
> array([[1, 0, 4],
>       [0, 0, 5],
>       [2, 3, 6]])

type(sv)
<class 'scipy.sparse.csc.csc_matrix'>

#read sv as RDD
sv_rdd = sc.parallelize(sv.toarray())  #transfer saprse to array
sv_rdd.collect()
> [array([1, 0, 4]), array([0, 0, 5]), array([2, 3, 6])]

type(sv_rdd)
> <class 'pyspark.rdd.RDD'>

但是,它是否将行编码为稀疏向量呢? - cgreen
我不这么认为。在 toarray() 之后,它变成了一个 ndarray。 - Yang Bryan
我的担忧是将其存储为RDD中每个条目的密集数组会浪费空间 - 我能否自动将scipy稀疏矩阵转换为PySpark中的一种稀疏存储类? - cgreen
我了解你的担忧,但目前似乎没有更好的方法可以直接将scipy稀疏矩阵转换为spark稀疏矩阵。 - Yang Bryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接