【问题标题】:Handle Huge (Local) Matrix in Spark在 Spark 中处理巨大的(本地)矩阵
【发布时间】:2019-05-10 19:00:44
【问题描述】:

所以我在 Spark 中尝试协同过滤。假设我有 100 万用户,我正在使用 SparkML 的 pyspark.ml.stat.Correlation.corr 来计算用户对之间的 Pearson 相关性。通过文档,这个方法returns

包含向量列的相关矩阵的 DataFrame。此 DataFrame 包含名称为“$METHODNAME($COLUMN)”的单行和单列。

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

问题:

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

  2. 我怎样才能使这个巨大的本地矩阵分布式 RDD/数据帧(这样我就可以做事)?如果它是本地的,我无能为力。

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

不起作用(因为它将矩阵提取到一台机器中)。

【问题讨论】:

  • 计算逐项相似性将使矩阵更小(在我看来仍然很大),但我很想知道如何解决我的问题一般 .

标签: python apache-spark pyspark apache-spark-mllib apache-spark-ml


【解决方案1】:

我认为您可能对文档有所误解。 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.        ]])

【讨论】:

  • 我明白了。但是我怎样才能并行处理矩阵呢?我想我必须collect 数据框,提取矩阵,然后使其成为分布式结构。当我收集数据框时,会有内存问题。
  • 跟进您的回答:Spark 如何分发只有 one 行的数据帧?或者,它如何处理一个巨大的细胞?我认为 spark 存储分布的不同行,但行/单元格总是存在于一台机器上?你能推荐我参考这方面的文档吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 2013-10-22
  • 1970-01-01
  • 2014-12-21
  • 2012-01-30
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多