利用Spark预测回头客实验报告

利用Spark预测回头客实验报告

1. 实验要求

test.csv和train.csv,文件中的字段定义如下:

  1. user_id | 买家id

  2. age_range | 买家年龄分段:1表示年龄<18,2表示年龄在[18,24],3表示年龄在[25,29],4表示年龄在[30,34],5表示年龄在[35,39],6表示年龄在[40,49],7和8表示年龄>=50,0和NULL则表示未知

  3. gender | 性别:0表示女性,1表示男性,2和NULL表示未知

  4. merchant_id | 商家id

  5. 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
image-20220706105701839

(3)输出train.csv前五行字段并删除train.csv的第一行无用字段后再次输出前五行

head -5 train.csv
sed -i '1d' train.csv
head -5 train.csv
image-20220706154421694 image-20220706105818611

(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
image-20220706110850509
  • 将两个数据集分别上传到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
image-20220706112037468

(6)进入mysql数据库并使用dbtaobao11创建一张rebuy(回头客)分析的表,其中包含score和label字段设定为varchar(40)

use dbtaobao11;
create table rebuy (score varchar(40),label varchar(40));
show tables;

image-20220706112339832

(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
image-20220706113550861
  • 导入所需的包
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)

image-20220706150101788

  • 评估模型
model.clearThreshold()
val scoreAndLabels = test.map{point =>
  val score = model.predict(point.features)
  score+" "+point.label
}
scoreAndLabels.foreach(println)
image-20220706150121870
  • 设定阈值0.0
model.setThreshold(0.0)
scoreAndLabels.foreach(println)
image-20220706150201093
  • 清除阈值
model.clearThreshold()
val scoreAndLabels = test.map{point =>
  val score = model.predict(point.features)
  score+" "+point.label
}
scoreAndLabels.foreach(println)
image-20220706150240898

(9)spark把结果添加到mysql数据库rebuy表中

  • 设置模式信息
val schema = StructType(List(StructField("score", StringType, true),StructField("label", StringType, true)))

image-20220706155421860

  • 设置回头客数据
val rebuyRDD = scoreAndLabels.map(_.split(" "))

image-20220706161437673

  • 创建Row对象
val rowRDD = rebuyRDD.map(p => Row(p(0).trim, p(1).trim))

image-20220706161453957

  • 建立起Row对象和模式之间的对应关系
val rebuyDF = spark.createDataFrame(rowRDD, schema)

image-20220706161617888

  • 创建一个prop变量用来保存JDBC连接参数
val prop = new Properties()
prop.put("user", "root")
prop.put("password", "Admin123.")
prop.put("driver","com.mysql.jdbc.Driver")
image-20220706161654210
  • 连接数据库
rebuyDF.write.mode("append").jdbc("jdbc:mysql://localhost:3306/dbtaobao11", "dbtaobao11.rebuy", prop)
  • 查看数据库中的表rebuy前十行
use dbtaobao11;
select * from rebuy limit 11;
image-20220706161856832
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值