将Spark数据帧转换为Spark DenseMatrix以进行操作

时间:2017-02-17 22:22:57

标签: apache-spark pyspark spark-dataframe apache-spark-mllib

我已经浏览了整个互联网,并且无法找到如何简单地将spark中的数据帧转换为矩阵,因此我可以对其进行矩阵运算。

如何在Spark 2中实现这一目标?

1 个答案:

答案 0 :(得分:1)

了解spark中的DenseMatrix会创建一个本地而非分布式矩阵,并将所有内容放在单个节点中。可以通过以下方式创建密集矩阵

# Constructor : DenseMatrix(numRows, numCols, values)
from pyspark.mllib.linalg import Matrix, Matrices
dm2 = Matrices.dense(3, 2, [1, 2, 3, 4, 5, 6])

但是你必须将所有行传递到一个大的列表中,这完全违背了使用spark的目的。

如果您正在寻找仅在数据框架上进行矩阵运算并且没有挂在DenseMatrix格式上,我建议您使用RowMatrix中的pyspark.mllib.linalg.distributed构造函数

将rdd转换为密集矩阵非常简单,如下所示

from pyspark.mllib.linalg.distributed import RowMatrix

# Create an RDD of vectors.
rows = sc.parallelize([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])

# Create a RowMatrix from an RDD of vectors.
mat = RowMatrix(rows)

# Get its size.
m = mat.numRows()  # 4
n = mat.numCols()  # 3

如果是数据框,您只需将df.rdd传递给RowMatrix构造函数即可。有关RowMatrix不同方法的更多详细信息,请访问以下链接:https://spark.apache.org/docs/latest/api/python/pyspark.mllib.html#pyspark.mllib.linalg.distributed.RowMatrix