2016-11-17 192 views
2

我有一个从scipy(300k x 100k与所有二进制值,大多为零)大型稀疏矩阵。我想将此矩阵的行设置为RDD,然后对这些行执行一些计算 - 评估每行上的函数,评估行对上的函数等。从scipy稀疏矩阵创建稀疏RDD

关键的是它很稀疏我不想爆炸集群 - 我可以将行转换为SparseVectors吗?或者也许将整个事情转换为SparseMatrix?

你可以举一个例子,你在稀疏数组中读取数据,将行设置到RDD中,并从这些行的笛卡尔乘积中计算出某些东西?

+0

尝试使用[pyspark](https://spark.apache.org/docs/latest/api/python/pyspark.mllib.html?highlight=sparsematrix#pyspark.mllib。 linalg.SparseMatrix)。 –

+0

@EliSadoff我正在使用pyspark,问题是我不知道要使用哪些对象或如何设置它们。 – cgreen

+0

啊,我没有意识到这一点。我以为你想弄清楚如何从python到scala。 –

回答

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'> 
+0

正确,但它是否将行编码为稀疏向量? – cgreen

+0

我不这么认为。在'toarray()'后面,它成了一个ndarray。 –

+0

我担心的是,将它作为密集阵列存储在RDD的每个条目中都是浪费空间 - 我可以自动将scipy稀疏矩阵转换为PySpark中的稀疏存储类之一吗? – cgreen

2

最近,我有这个问题 - 我想你可以通过与SciPy的csc_matrix属性构建稀疏矩阵直接转换。 (从阳布赖恩借用)

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)