【问题标题】:Pyspark sparse vector dataframe to scipy.spare without collectingPyspark稀疏向量数据帧到scipy.spare而不收集
【发布时间】:2017-10-04 18:19:17
【问题描述】:

我有这个稀疏的 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 的最有效方法是什么?我正在处理大型矩阵,所以它不是首选。

【问题讨论】:

    标签: scipy pyspark sparse-matrix collect


    【解决方案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 矩阵的函数。我已经关注了一些关于此的 SO 问题(可能已过时)。

    【讨论】:

    • 没错,用scipy生成一个收集集群驱动节点数据的稀疏矩阵很容易,但是我想用分布式的方式来做。
    猜你喜欢
    • 2017-03-26
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2017-08-30
    • 2019-08-03
    • 2017-05-10
    • 1970-01-01
    相关资源
    最近更新 更多