如何使用 DataFrame 在 Spark 中构建 CoordinateMatrix?

Dim*_*los 5 collaborative-filtering pyspark spark-dataframe apache-spark-mllib

我正在尝试将 ALS 算法的 Spark 实现用于推荐系统,因此我构建了如下所示的 DataFrame 作为训练数据:

|--------------|--------------|--------------|
|    userId    |    itemId    |    rating    |
|--------------|--------------|--------------|
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个稀疏矩阵来表示每个用户和每个项目之间的交互。该矩阵将是稀疏的,因为如果用户和项目之间没有交互,则矩阵中的相应值将为零。因此,最终,大多数值将为零。

但是如何使用 CoordinateMatrix 实现这一点?我说 CoordinateMatrix 是因为我使用的是 Spark 2.1.1 和 python,在文档中,我看到只有当矩阵的两个维度都很大并且矩阵非常稀疏时才应该使用 CoordinateMatrix。

换句话说,我怎样才能从这个 DataFrame 到一个 CoordinateMatrix,其中行是用户,列是项目,评级是矩阵中的值?

Dav*_*yne 8

CoordinateMatrix 只是 MatrixEntrys 的 RDD 的包装器。MatrixEntry 只是(长、长、浮点)元组的包装器。Pyspark 允许您从此类元组的 RDD 创建 CoordinateMatrix。如果userIditemId字段都是ratingIntegerTypes并且是 FloatType 之类的东西,那么创建所需的矩阵非常简单。

from pyspark.mllib.linalg.distributed import CoordinateMatrix

cmat=CoordinateMatrix(df.rdd.map(tuple))
Run Code Online (Sandbox Code Playgroud)

如果您有userIditemId字段的StringTypes,它只会稍微复杂一些。您需要先索引这些字符串,然后将索引传递给 CoordinateMatrix。