Crear un RDD escaso a partir de una matriz escasa dispersa

Tengo una gran matriz dispersa de scipy (300k x 100k con todos los valores binarios, principalmente ceros). Me gustaría configurar las filas de esta matriz para que sean un RDD y luego hacer algunos cálculos en esas filas: evaluar una función en cada fila, evaluar funciones en pares de filas, etc.

Lo importante es que es bastante escaso y no quiero explotar el clúster. ¿Puedo convertir las filas a SparseVectors? ¿O quizás convertir todo a SparseMatrix?

¿Puede dar un ejemplo donde lea en una matriz dispersa, configure filas en un RDD y calcule algo del producto cartesiano de esas filas?

Tuve este problema recientemente: creo que puedes convertir directamente construyendo el SparseMatrix con los atributos scscy csc_matrix. (Préstamo de 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) 

Lo único que tienes que hacer es 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)  #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) >