文章目录
- 利用Spark预测回头客实验报告
- 1. 实验要求
- 1.1 实验操作
- 2. 实验步骤
- (1)处理test.csv数据集,把test.csv数据集里label字段表示-1值剔除掉,保留需要预测的数据,并假设需要预测的数据中label字段均为1(sh脚本编写 test_test.sh)
- (2)执行test_test.sh将获取test.csv输出为test_after.csv文件保存
- (3)输出train.csv前五行字段并删除train.csv的第一行无用字段后再次输出前五行
- (4)编写脚本predeal_train.sh做剔除部分字段为空的数据
- (5)执行predeal_train.sh将获取train.csv输出为train_after.csv文件保存
- (6)进入mysql数据库并使用dbtaobao11创建一张rebuy(回头客)分析的表,其中包含score和label字段设定为varchar(40)
- (7)将jar数据库驱动拉至spark目录/jars下启动spark-shell
- (8)spark加载初两个csv数据、构建模型、评估模型,其中 需要输出负数和正数模型内容
- (9)spark把结果添加到mysql数据库rebuy表中
利用Spark预测回头客实验报告
1. 实验要求
test.csv和train.csv,文件中的字段定义如下:
- user_id | 买家id
- age_range | 买家年龄分段:1表示年龄<18,2表示年龄在[18,24],3表示年龄在[25,29],4表示年龄在[30,34],5表示年龄在[35,39],6表示年龄在[40,49],7和8表示年龄>=50,0和NULL则表示未知
- gender | 性别:0表示女性,1表示男性,2和NULL表示未知
- merchant_id | 商家id
- label | 是否是回头客,0值表示不是回头客,1值表示回头客,-1值表示该用户已经超出我们所需要考虑的预测范围。NULL值只存在测试集,在测试集中表示需要预测的值。
1.1 实验操作
(1)处理test.csv数据集,把test.csv数据集里label字段表示-1值剔除掉,保留需要预测的数据,并假设需要预测的数据中label字段均为1(sh脚本编写 test_test.sh)
(2)执行test_test.sh将获取test.csv输出为test_after.csv文件保存
(3)输出train.csv前五行字段并删除train.csv的第一行无用字段后再次输出前五行
(4)编写脚本train_train.sh做剔除部分字段为空的数据
(5)执行train_train.sh将获取train.csv输出为train_after.csv文件保存
(6)进入mysql数据库并使用dbtaobao创建一张rebuy(回头客)分析的表,其中包含score和label字段设定为varchar(40)
(7)将jar数据库驱动拉至spark目录/jars下启动spark-shell
(8)spark加载初两个csv数据、构建模型、评估模型
其中 需要输出 负数 和 正数 模型 内容
(9)spark把结果添加到mysql数据库rebuy表中
2. 实验步骤
(1)处理test.csv数据集,把test.csv数据集里label字段表示-1值剔除掉,保留需要预测的数据,并假设需要预测的数据中label字段均为1(sh脚本编写 test_test.sh)
- 创建脚本predeal_test.sh
vim predeal_test.sh
#!/bin/bash
infile=$1
outfile=$2
awk -F "," 'BEGIN{
id=0;
}
{
if($1 && $2 && $3 && $4 && !$5){
id=id+1;
print $1","$2","$3","$4","1
if(id==10000){
exit
}
}
}' $infile > $outfile
(2)执行test_test.sh将获取test.csv输出为test_after.csv文件保存
- 为predeal_test.sh提权并执行
chmod +x ./predeal_test.sh
./predeal_test.sh ./test.csv ./test_after.csv
head -5 test_after.csv
(3)输出train.csv前五行字段并删除train.csv的第一行无用字段后再次输出前五行
head -5 train.csv
sed -i '1d' train.csv
head -5 train.csv
(4)编写脚本predeal_train.sh做剔除部分字段为空的数据
- 创建脚本predeal_train.sh
vim predeal_train.sh
#!/bin/bash
infile=$1
outfile=$2
awk -F "," 'BEGIN{
id=0;
}
{
if($1 && $2 && $3 && $4 && ($5!=-1)){
id=id+1;
print $1","$2","$3","$4","$5
if(id==10000){
exit
}
}
}' $infile > $outfile
(5)执行predeal_train.sh将获取train.csv输出为train_after.csv文件保存
- 为predeal_train.sh提权并执行
chmod +x ./predeal_train.sh
./predeal_train.sh ./train.csv ./train_after.csv
head -5 train_after.csv
- 将两个数据集分别上传到HDFS中
bin/hadoop fs -put /usr/local/dbtaobao/dataset/test_after.csv /dbtaobao/dataset
bin/hadoop fs -put /usr/local/dbtaobao/dataset/train_after.csv /dbtaobao/dataset
(6)进入mysql数据库并使用dbtaobao11创建一张rebuy(回头客)分析的表,其中包含score和label字段设定为varchar(40)
use dbtaobao11;
create table rebuy (score varchar(40),label varchar(40));
show tables;
(7)将jar数据库驱动拉至spark目录/jars下启动spark-shell
cp -r /mnt/hgfs/mysql-connector-java-8.0.15.jar /opt/spark-2.4.5/jars/
./bin/spark-shell --jars /opt/spark-2.4.5/jars/mysql-connector-java-8.0.15.jar --driver-class-path /opt/spark-2.4.5/jars/mysql-connector-java-8.0.15.jar
- 导入所需的包
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.{Vectors,Vector}
import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import java.util.Properties
import org.apache.spark.sql.types._
import org.apache.spark.sql.Row
(8)spark加载初两个csv数据、构建模型、评估模型,其中 需要输出负数和正数模型内容
- 读取训练数据
val test_data = sc.textFile("hdfs://192.168.85.100:9000/dbtaobao/dataset/test_after.csv")
val train_data = sc.textFile("hdfs://192.168.85.100:9000/dbtaobao/dataset/train_after.csv")
- 构建模型
val test = test_data.map{line =>
val parts = line.split(',')
LabeledPoint(parts(4).toDouble,Vectors.dense(parts(1).toDouble,parts(2).toDouble,parts(3).toDouble))
}
val train= train_data.map{line =>
val parts = line.split(',')
LabeledPoint(parts(4).toDouble,Vectors.dense(parts(1).toDouble,parts(2).toDouble,parts(3).toDouble))
}
val numIterations = 1000
val model = SVMWithSGD.train(train, numIterations)
- 评估模型
model.clearThreshold()
val scoreAndLabels = test.map{point =>
val score = model.predict(point.features)
score+" "+point.label
}
scoreAndLabels.foreach(println)
- 设定阈值0.0
model.setThreshold(0.0)
scoreAndLabels.foreach(println)
- 清除阈值
model.clearThreshold()
val scoreAndLabels = test.map{point =>
val score = model.predict(point.features)
score+" "+point.label
}
scoreAndLabels.foreach(println)
(9)spark把结果添加到mysql数据库rebuy表中
- 设置模式信息
val schema = StructType(List(StructField("score", StringType, true),StructField("label", StringType, true)))
- 设置回头客数据
val rebuyRDD = scoreAndLabels.map(_.split(" "))
- 创建Row对象
val rowRDD = rebuyRDD.map(p => Row(p(0).trim, p(1).trim))
- 建立起Row对象和模式之间的对应关系
val rebuyDF = spark.createDataFrame(rowRDD, schema)
- 创建一个prop变量用来保存JDBC连接参数
val prop = new Properties()
prop.put("user", "root")
prop.put("password", "Admin123.")
prop.put("driver","com.mysql.jdbc.Driver")
- 连接数据库
rebuyDF.write.mode("append").jdbc("jdbc:mysql://localhost:3306/dbtaobao11", "dbtaobao11.rebuy", prop)
- 查看数据库中的表rebuy前十行
use dbtaobao11;
select * from rebuy limit 11;