Spark mllib:如何将字符串分类功能转换为int以使Rating接受

时间:2016-07-29 08:48:02

标签: scala apache-spark apache-spark-mllib collaborative-filtering

我想在协同过滤技术中使用spark mllib和ALS算法构建推荐应用程序。我的数据集具有字符串形式的用户和产品功能,如:

[{"user":"StringName1", "product":"StringProduct1", "rating":1},
 {"user":"StringName2", "product":"StringProduct2", "rating":2},
 {"user":"StringName1", "product":"StringProduct2", "rating":3},..]

但是Rating方法似乎只接受用户和产品功能的int值。这是否意味着我必须构建一个单独的字典来将每个字符串映射到一个int?我的数据集将包含用户和产品的重复条目。在mllib库本身中是否有内置的解决方案?

谢谢,感谢任何帮助!

编辑:不,这不是重复,因为该问题的答案似乎不适合我的方案。 spark.ml.recommendation.ALS.Rating库似乎不支持useritem的字符串值。我需要这种支持。

1 个答案:

答案 0 :(得分:4)

让我试试。假设data: RDD[(String, String, Float)]

import org.apache.spark.mllib.recommendation.Rating

val data = sc.parallelize(Array(("StringName1", "StringProduct1", 1.0), ("StringName2", "StringProduct2", 2.0), ("StringName3", "StringProduct3", 3.0)))

//get distinct names and products and create maps from them
val names = data.map(_._1).distinct.sortBy(x => x).zipWithIndex.collectAsMap
val products = data.map(_._2).distinct.sortBy(x => x).zipWithIndex.collectAsMap

//convert to Rating format
val data_rating = data.map(r => Rating(names(r._1).toInt, products(r._2).toInt, r._3))

应该这样做。基本上,您只需创建从string到long的映射,然后将long转换为int。