Pyspark稀疏矢量数据帧到scipy.spare没有收集

时间:2017-10-04 18:19:18

标签: scipy pyspark sparse-matrix collect

我有这个稀疏的Spark数据帧:

In [50]: data.show()
+---------+-------+---------+-------+-------+--------+
|      pid| 111516|   387745|1211811|1857606| 2187005|
+---------+-------+---------+-------+-------+--------+
| 65197201|    0.0|      0.0|50239.0|    0.0|     0.0|
| 14040501|89827.0|      0.0|    0.0|    0.0|     0.0|
|887847003|    0.0|      0.0|    0.0|    0.0|190560.0|
|778121903|    0.0|      0.0|    0.0|95600.0|     0.0|
| 20907001|    0.0|8727749.0|    0.0|    0.0|     0.0|
+---------+-------+---------+-------+-------+--------+

我将其转换为两列数据帧,索引ID和数据为稀疏矢量:

input_cols = [x for x in data.columns if x!='pid']
sparse_vectors = (VectorAssembler(inputCols=input_cols, outputCol="features").transform(data).select("pid", "features"))

In [46]: sparse_vectors.show()
+---------+-------------------+
|      pid|           features|
+---------+-------------------+
| 65197201|  (5,[2],[50239.0])|
| 14040501|  (5,[0],[89827.0])|
|887847003| (5,[4],[190560.0])|
|778121903|  (5,[3],[95600.0])|
| 20907001|(5,[1],[8727749.0])|
+---------+-------------------+
In [51]: sparse_vectors.dtypes
Out[51]: [('pid', 'string'), ('features', 'vector')]

将此转换为任何scipy.sparse类型without collecting的最有效方法是什么?我正在使用大型矩阵,因此它不是首选方案。

1 个答案:

答案 0 :(得分:1)

什么是稀疏矩阵应该是什么样的?

只要注视表格,忽略pid标题,我就可以生成稀疏矩阵:

In [456]: from scipy import sparse
In [457]: rows = [0,1,2,3,4]
In [458]: cols = [2,0,4,3,1]
In [459]: vals = [50239.0,89827.0,190560.0,95600,8727749]
In [460]: M = sparse.coo_matrix((vals,(rows,cols)),shape=(5,5))
In [461]: M
Out[461]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>'
    with 5 stored elements in COOrdinate format>
In [462]: M.A
Out[462]: 
array([[       0.,        0.,    50239.,        0.,        0.],
       [   89827.,        0.,        0.,        0.,        0.],
       [       0.,        0.,        0.,        0.,   190560.],
       [       0.,        0.,        0.,    95600.,        0.],
       [       0.,  8727749.,        0.,        0.,        0.]])

虽然我很了解事情的结果,但我不知道pyspark。 Pandas有自己的稀疏表示,还有一些用于创建scipy矩阵的函数。我已经跟踪了一些关于那个问题(可能已经过时了)。