【发布时间】:2017-08-20 22:26:47
【问题描述】:
我正在使用 PySpark 使用 ALS 进行协同过滤。我的原始用户和项目 ID 是字符串,所以我使用 StringIndexer 将它们转换为数字索引(PySpark 的 ALS 模型要求我们这样做)。
在我拟合模型后,我可以获得每个用户的前 3 条建议,如下所示:
recs = (
model
.recommendForAllUsers(3)
)
recs 数据框如下所示:
+-----------+--------------------+
|userIdIndex| recommendations|
+-----------+--------------------+
| 1580|[[10096,3.6725707...|
| 4900|[[10096,3.0137873...|
| 5300|[[10096,2.7274625...|
| 6620|[[10096,2.4493625...|
| 7240|[[10096,2.4928937...|
+-----------+--------------------+
only showing top 5 rows
root
|-- userIdIndex: integer (nullable = false)
|-- recommendations: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- productIdIndex: integer (nullable = true)
| | |-- rating: float (nullable = true)
我想用这个数据框创建一个巨大的 JSOM 转储,我可以这样:
(
recs
.toJSON()
.saveAsTextFile("name_i_must_hide.recs")
)
这些 json 的示例是:
{
"userIdIndex": 1580,
"recommendations": [
{
"productIdIndex": 10096,
"rating": 3.6725707
},
{
"productIdIndex": 10141,
"rating": 3.61542
},
{
"productIdIndex": 11591,
"rating": 3.536216
}
]
}
userIdIndex 和 productIdIndex 键是由 StringIndexer 转换产生的。
我怎样才能恢复这些列的原始值?我怀疑我必须使用IndexToString 转换器,但由于数据嵌套在recs 数据框内的数组中,所以我不太清楚。
我尝试使用 Pipeline 评估器 (stages=[StringIndexer, ALS, IndexToString]),但该评估器似乎不支持这些索引器。
干杯!
【问题讨论】:
标签: python apache-spark pyspark apache-spark-sql apache-spark-ml