package com.lj.als import org.apache.spark.mllib.recommendation.{ALS, Rating} import org.apache.spark.{SparkConf, SparkContext} object Driver { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local").setAppName("als") val sc = new SparkContext(conf) val data = sc.textFile("e://data/als.txt") //--为了满足Spark建模要求: //--RDD[String]->RDD[Rating(userId[Int],itemId[Int],score[Double])] val r1 = data.map { line => val info = line.split(" ") val userId = info(0).toInt val itemId = info(1).toInt val score = info(2).toDouble Rating(userId, itemId, score) } // r1.foreach(println) //--①参:数据集 ②参:隐藏因子数 K,根据实际情况来定 ③参:最大的迭代次数 ④参:λ 正则化参数,防止模型过拟合 val model = ALS.train(r1, 3, 10, 0.01) val u5Result = model.recommendProducts(5, 2) //--下面表示为5号用户,推荐两个商品 val item12Result = model.recommendUsers(12, 1) //--下面表示为12号商品,推荐1个用户 val u3Predict = model.predict(3, 14) //--下面表示预测3号用户对14号商品的评分 u5Result.foreach {println} item12Result.foreach {println} println(u3Predict) } }
时间: 2024-03-18 09:44:56 浏览: 164
这是一个使用 Apache Spark 中的 ALS(Alternating Least Squares)算法进行推荐的例子,包含以下步骤:
1. 导入需要使用的包,其中包括 ALS 算法和 Rating 类。
2. 创建 SparkConf 和 SparkContext 对象。
3. 使用 SparkContext 的 textFile 方法读取数据集文件,该文件中每行包含一个用户 ID、一个物品 ID 和一个评分,用空格分隔。
4. 将数据集 RDD[String] 转换为 RDD[Rating],其中每个 Rating 对象包含一个用户 ID、一个物品 ID 和一个评分。
5. 调用 ALS.train 方法,传入 RDD[Rating]、隐藏因子数 K、最大的迭代次数和正则化参数 λ,训练 ALS 模型。
6. 调用 ALS 模型的 recommendProducts 方法,传入一个用户 ID 和要推荐的物品数,得到该用户可能喜欢的物品列表。
7. 调用 ALS 模型的 recommendUsers 方法,传入一个物品 ID 和要推荐的用户数,得到可能喜欢该物品的用户列表。
8. 调用 ALS 模型的 predict 方法,传入一个用户 ID 和一个物品 ID,得到该用户对该物品的评分预测值。
9. 输出结果。
希望对你有所帮助!
相关问题
Traceback (most recent call last): File "/root/spark_code/recommend/train.py", line 1, in <module> from pyspark.mllib.recommendation import ALS File "/opt/module/anaconda3/envs/pyspark/lib/python3.8/site-packages/pyspark/mllib/__init__.py", line 26, in <module> import numpy ModuleNotFoundError: No module named 'numpy'
这个错误是因为你的Python环境缺少numpy模块。你需要安装numpy模块,可以通过使用pip命令来安装:
```
pip install numpy
```
如果你使用的是conda环境,可以使用conda命令来安装:
```
conda install numpy
```
安装完成后,你可以再次运行你的代码。
java.util.LinkedHashMap cannot be cast to com.travelsky.iap.als.adb.ms.ft.model.export.dataInfo.TrusteeInfo
### 解析 `java.util.LinkedHashMap cannot be cast to TrusteeInfo` 异常
当遇到 `java.util.LinkedHashMap cannot be cast to TrusteeInfo` 这类异常时,表明程序尝试将一个 `LinkedHashMap` 对象强制转换为自定义的 `TrusteeInfo` 类型。这类问题通常发生在使用诸如 `RestTemplate` 或其他 HTTP 客户端库来解析 JSON 数据到 Java 对象的过程中。
#### 原因分析
该异常的根本原因在于反序列化过程中未能正确指定目标对象类型。默认情况下,JSON 反序列化工具(如 Jackson)会创建最接近的数据结构表示——通常是 Map 或 List 形式的集合容器,而不是具体的业务实体类实例[^4]。
#### 正确处理方式
为了防止此类异常的发生,在通过 REST API 获取数据并期望得到特定类型的对象列表时,应该明确告知框架如何映射这些原始数据至预期的目标类型。具体做法如下:
1. 使用泛型参数化的 `ParameterizedTypeReference<T>` 来指明确切的结果集类型;
2. 创建一个新的类用于封装响应消息体中的实际内容字段;
下面是一个改进后的代码片段展示如何实现这一点:
```java
// 定义一个包装器类来承载API返回的具体条目
public class ResponseWrapper {
private List<TrusteeInfo> content;
public List<TrusteeInfo> getContent() { return this.content; }
}
// 调用外部服务获取数据,并将其直接映射为目标类型
ResponseEntity<ResponseWrapper> response = restTemplate.exchange(
url,
HttpMethod.GET,
null,
new ParameterizedTypeReference<ResponseWrapper>() {}
);
List<TrusteeInfo> trusteeInfos = Objects.requireNonNull(response.getBody()).getContent();
```
上述方法可以确保即使服务器端发送的是标准 JSON 数组格式的数据流,客户端也能顺利地将其解释为一组 `TrusteeInfo` 实例而不会触发非法类型转换错误。
此外,如果只是单个对象而非列表,则可以直接利用 `restTemplate.getForObject()` 方法配合相应的 POJO 类完成同样的操作。
对于已经发生的异常情况,可以通过捕获 `ClassCastException` 并采取适当措施来进行优雅降级或记录日志以便后续排查问题所在。
阅读全文
相关推荐




