首页 文章

处理Spark中的巨大(本地)矩阵

提问于
浏览
0

所以我说我有100万用户,我用'm using SparkML' s pyspark.ml.stat.Correlation.corr 来计算用户对之间的Pearson相关性 . 通过文档,这个方法returns

包含向量列的相关矩阵的DataFrame . 此DataFrame包含单行和单个名称为'$ METHODNAME($ COLUMN)'的列 .

矩阵( DenseMatrix )本身不是分布式的(local),根据我的理解,它必须适合我的驱动程序机器的内存 .

题:

  • 包含此矩阵的数据框是否跨越多台机器?我知道Spark分区数据框架,但我认为这是多行的情况?

  • 如何使这个巨大的局部矩阵分布式RDD /数据帧(所以我可以 do things )?如果它是本地的,我无能为力 .

thisMatrix = thisDataFrame.take(1)[0][0]
sc.parallelize(thisMatrix.toArray())

将无法工作(因为它将矩阵提取到一台机器) .

1 回答

  • 0

    我想你可能会误解一下这些文档 . Corelation.corr 返回 DataFrame ,与任何其他Pyspark DataFrame 完全一样 . 如果您要执行以下呼叫:

    pearsonCorr = Correlation.corr(dataset, 'features', 'pearson')
    

    没有数据将被发送回驱动程序节点 . 这将是真实的,直到在 pearsonCorr 上调用实际操作,例如 collect . Correlation docs中提到的 DenseMatrix 实际上是 collect 调用的结果,而不是对 Correlation.corr 本身的调用:

    pearsonCorr = Correlation.corr(dataset, 'features', 'pearson').collect()[0][0]
    print(str(pearsonCorr).replace('nan', 'NaN'))
    
    DenseMatrix([[ 1.        ,  0.0556...,         NaN,  0.4004...],
                 [ 0.0556...,  1.        ,         NaN,  0.9135...],
                 [        NaN,         NaN,  1.        ,         NaN],
                 [ 0.4004...,  0.9135...,         NaN,  1.        ]])
    

相关问题