如何使用 DataFrame 在 Spark 中构建 CoordinateMatrix?
How can I build a CoordinateMatrix in Spark using a DataFrame?
我正在尝试将 ALS 算法的 Spark 实现用于推荐系统,因此我构建了如下所示的 DataFrame 作为训练数据:
|--------------|--------------|--------------|
| userId | itemId | rating |
|--------------|--------------|--------------|
现在,我想创建一个稀疏矩阵,来表示每个用户和每个项目之间的交互。矩阵将是稀疏的,因为如果用户和项目之间没有交互,矩阵中的相应值将为零。因此,最终,大多数值将为零。
但是我如何使用 CoordinateMatrix 实现这一点?我说 CoordinateMatrix 是因为我使用的是 Spark 2.1.1,python,并且在文档中,我看到只有当矩阵的两个维度都很大并且矩阵非常稀疏时才应该使用 CoordinateMatrix .
换句话说,我如何从这个 DataFrame 到 CoordinateMatrix,其中行是用户,列是项目,评分是矩阵中的值?
CoordinateMatrix 只是对 MatrixEntry 的 RDD 的包装。 MatrixEntry 只是 (long, long, float) 元组的包装器。 Pyspark 允许您从此类元组的 RDD 创建 CoordinateMatrix。如果 userId
和 itemId
字段都是 IntegerTypes 并且 rating
类似于 FloatType,那么创建所需的矩阵非常简单。
from pyspark.mllib.linalg.distributed import CoordinateMatrix
cmat=CoordinateMatrix(df.rdd.map(tuple))
如果您为 userId
和 itemId
字段设置了 StringType,情况只会稍微复杂一些。您需要先为这些字符串编制索引,然后将索引传递给 CoordinateMatrix。
使用Spark 2.4.0,我展示了整个示例,希望能满足您的需求。
使用字典创建数据框 pandas:
my_dict = {
'userId': [1,2,3,4,5,6],
'itemId': [101,102,103,104,105,106],
'rating': [5.7, 8.8, 7.9, 9.1, 6.6, 8.3]
}
import pandas as pd
pd_df = pd.DataFrame(my_dict)
df = spark.createDataFrame(pd_df)
查看数据框:
df.show()
+------+------+------+
|userId|itemId|rating|
+------+------+------+
| 1| 101| 5.7|
| 2| 102| 8.8|
| 3| 103| 7.9|
| 4| 104| 9.1|
| 5| 105| 6.6|
| 6| 106| 8.3|
+------+------+------+
从数据框创建坐标矩阵:
from pyspark.mllib.linalg.distributed import CoordinateMatrix, MatrixEntry
coorRDD = df.rdd.map(lambda x: MatrixEntry(x[0], x[1], x[2]))
coorMatrix = CoordinateMatrix(coorRDD)
现在查看结果的数据类型:
type(coorMatrix)
pyspark.mllib.linalg.distributed.CoordinateMatrix
我正在尝试将 ALS 算法的 Spark 实现用于推荐系统,因此我构建了如下所示的 DataFrame 作为训练数据:
|--------------|--------------|--------------|
| userId | itemId | rating |
|--------------|--------------|--------------|
现在,我想创建一个稀疏矩阵,来表示每个用户和每个项目之间的交互。矩阵将是稀疏的,因为如果用户和项目之间没有交互,矩阵中的相应值将为零。因此,最终,大多数值将为零。
但是我如何使用 CoordinateMatrix 实现这一点?我说 CoordinateMatrix 是因为我使用的是 Spark 2.1.1,python,并且在文档中,我看到只有当矩阵的两个维度都很大并且矩阵非常稀疏时才应该使用 CoordinateMatrix .
换句话说,我如何从这个 DataFrame 到 CoordinateMatrix,其中行是用户,列是项目,评分是矩阵中的值?
CoordinateMatrix 只是对 MatrixEntry 的 RDD 的包装。 MatrixEntry 只是 (long, long, float) 元组的包装器。 Pyspark 允许您从此类元组的 RDD 创建 CoordinateMatrix。如果 userId
和 itemId
字段都是 IntegerTypes 并且 rating
类似于 FloatType,那么创建所需的矩阵非常简单。
from pyspark.mllib.linalg.distributed import CoordinateMatrix
cmat=CoordinateMatrix(df.rdd.map(tuple))
如果您为 userId
和 itemId
字段设置了 StringType,情况只会稍微复杂一些。您需要先为这些字符串编制索引,然后将索引传递给 CoordinateMatrix。
使用Spark 2.4.0,我展示了整个示例,希望能满足您的需求。 使用字典创建数据框 pandas:
my_dict = {
'userId': [1,2,3,4,5,6],
'itemId': [101,102,103,104,105,106],
'rating': [5.7, 8.8, 7.9, 9.1, 6.6, 8.3]
}
import pandas as pd
pd_df = pd.DataFrame(my_dict)
df = spark.createDataFrame(pd_df)
查看数据框:
df.show()
+------+------+------+
|userId|itemId|rating|
+------+------+------+
| 1| 101| 5.7|
| 2| 102| 8.8|
| 3| 103| 7.9|
| 4| 104| 9.1|
| 5| 105| 6.6|
| 6| 106| 8.3|
+------+------+------+
从数据框创建坐标矩阵:
from pyspark.mllib.linalg.distributed import CoordinateMatrix, MatrixEntry
coorRDD = df.rdd.map(lambda x: MatrixEntry(x[0], x[1], x[2]))
coorMatrix = CoordinateMatrix(coorRDD)
现在查看结果的数据类型:
type(coorMatrix)
pyspark.mllib.linalg.distributed.CoordinateMatrix