在docker中安装numpy
命令:apk add py3-numpy
更改pyspark的python版本,根据02的描述
其他人提供的一种方法:
1.docker exec -it spark-master /bin/sh
2.echo http://mirrors.aliyun.com/alpine/v3.7/main/ >> /etc/apk/repositories #配置阿里镜像源
3.apk update #查看是否成功
4.docker exec -it spark-master bash
5.apk add py3-numpy #安装numpy库
6.进入bash5.0#后,再export PYSPARK_PYTHON=python3 #调用python3,(每次使用都需要执行此命令)
7.再./spark/bin/pyspark
至此调用numpy不再报错
- 上传加载数据
上传本地:
docker cp E:/1-研究生/01-课程/大数据分析应用与实践/pyspark推荐引擎/ml-100k.zip a89262625a0a:/spark/data
- 在/spark/data目录下解压数据
unzip ml-100k.zip
- 我们使用sc.textFile读取ml-100k
我们使用sc.textFile读取HDFS上的ml-100k数据集中的u.data,并且查看数据项数
rawUserData = sc.textFile("hdfs://127.0.0.1:9000/ml-100k/u.data")
如果文件在本地:
rawUserData = sc.textFile("file:///spark/data/ml-100k/u.data")
查看数据项:
rawUserData.count() // 结果显示100000说明对了
- 查看u.data第一项数据
rawUserData.first()
结果:
'196\t242\t3\t881250949'
以上4个字段分别是:用户id、项目id、评分、日期时间,\t为分隔符。
- 导入Rating模块
from pyspark.mllib.recommendation import Rating
- 读取rawUserData前三个字段,按照用户、产品、用户对此产品的评价来编写rawRatings
rawRatings = rawUserData.map(lambda line:line.split("\t")[:3])
查看前5条
rawRatings.take(5)
下面开始准备ALS训练数据集
- ALS训练数据格式是RatingRDD数据类型,Rating定义如下:
字段 | 说明 |
---|---|
user | 用户 |
product | 产品 |
rating | 用户对此产品的评价 |
- 编写ratingsRDD
ratingsRDD = rawRatings.map(lambda x:(x[0],x[1],x[2]))
ratingsRDD.take(5)
- 查看ratingsRDD项数
numRatings = ratingsRDD.count()
numRatings 共有100000项评价
- 查看不重复用户数
x[0]是用户字段,可以先用.map(lambda x:x[0])转换为用户数据,再使用.distinct()筛选出不重复的数据,最后显示numUsers
numUsers = ratingsRDD.map(lambda x:x[0]).distinct().count()
numUsers
- 查看不重复电影数
x[1]是电影字段,可以先使用.map(lambda x:x[1])转换为电影数据,再使用.distinct()筛选出不重复的数据
numMovies = ratingsRDD.map(lambda x:x[1]).distinct().count()
numMovies
- 导入ALS模块
from pyspark.mllib.recommendation import ALS
- 使用ALS.train介绍
- 我们将使用ALS.train命令进行训练。ALS.train可分为显式评分与隐式评分训练。
- 显式评分(Explicit Rating)训练
ALS.train(ratings,rank,iterations=5,lambda_=0.01):
返回:MatrixFactorizationModel
- 隐式评分(Implicit Rating)训练
ALS.trainImplicit(ratings,rank,iterations=5,lambda_=0.01):
返回:MatrixFactorizationModel
运行代码:
model = ALS.train(ratingsRDD,10,10,0.01)
print(model)
model.recommendProducts(100,5)
model.predict(100,1141)