【问题标题】:Collect Spark dataframe into Numpy matrix将 Spark 数据帧收集到 Numpy 矩阵中
【发布时间】:2018-01-30 04:37:48
【问题描述】:

我使用 spark 在大型数据集上计算 PCA,现在我有一个具有以下结构的 spark 数据框:

Row('pcaFeatures'=DenseVector(elem1,emlem2..)) 

其中 elem1,..., elemN 是双精度数。我想将它转换为一个 numpy 矩阵。现在我正在使用以下代码:

numpymatrix = datapca.toPandas().as_Matrix()

但我得到一个带有 Object 类型元素而不是数字矩阵的 numpy Series。有没有办法得到我需要的矩阵?

【问题讨论】:

    标签: numpy pyspark spark-dataframe


    【解决方案1】:

    只有当结果数据可以放入您的主内存时,您的请求才有意义(即您可以安全地使用collect());另一方面,如果是这样的话,诚然你完全没有理由使用 Spark。

    无论如何,鉴于此假设,这是使用玩具数据将单列 features Spark 数据帧(Rows of DenseVector)转换为 NumPy 数组的通用方法:

    spark.version
    # u'2.2.0' 
    
    from pyspark.ml.linalg import Vectors
    import numpy as np
    
    # toy data:
    df = spark.createDataFrame([(Vectors.dense([0,45,63,0,0,0,0]),),
                                (Vectors.dense([0,0,0,85,0,69,0]),),
                                (Vectors.dense([0,89,56,0,0,0,0]) ,),
                               ], ['features'])
    
    dd = df.collect()
    dd
    # [Row(features=DenseVector([0.0, 45.0, 63.0, 0.0, 0.0, 0.0, 0.0])), 
    #  Row(features=DenseVector([0.0, 0.0, 0.0, 85.0, 0.0, 69.0, 0.0])), 
    #  Row(features=DenseVector([0.0, 89.0, 56.0, 0.0, 0.0, 0.0, 0.0]))] 
    
    np.asarray([x[0] for x in dd])
    # array([[ 0., 45., 63., 0., 0., 0., 0.],
    #        [ 0., 0., 0., 85., 0., 69., 0.],
    #        [ 0., 89., 56., 0., 0., 0., 0.]])
    

    【讨论】:

      猜你喜欢
      • 2017-12-17
      • 2018-12-13
      • 2018-08-05
      • 1970-01-01
      • 2022-08-19
      • 2013-12-25
      • 1970-01-01
      • 2012-02-20
      • 2017-05-27
      相关资源
      最近更新 更多