2017-10-04 88 views
0

我有這樣的疏火花數據幀:Pyspark稀疏矢量數據幀到scipy.spare而不收集

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

什麼是稀疏矩陣應該看起來像?

只是目測表,並忽略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.]]) 

雖然我知道的事情SciPy的結束好了,我不知道pyspark。熊貓有它自己的稀疏表示,以及一些從中創建scipy矩陣的函數。我跟着幾個關於這個問題的問題(可能會過時)。

+0

沒錯,它很容易生成一個稀疏矩陣,用scipy收集集羣驅動程序節點中的數據,但我想以分佈方式執行此操作。 – xv70