我有这个稀疏的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的最有效方法是什么?我正在使用大型矩阵,因此它不是首选方案。
答案 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矩阵的函数。我已经跟踪了一些关于那个问题(可能已经过时了)。