文章目录

  • 利用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,文件中的字段定义如下:

  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


spark如何进行数据预处理 spark预测分析_字段

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

head -5 train.csv
sed -i '1d' train.csv
head -5 train.csv


spark如何进行数据预处理 spark预测分析_字段_02

spark如何进行数据预处理 spark预测分析_spark_03

(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


spark如何进行数据预处理 spark预测分析_字段_04

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


spark如何进行数据预处理 spark预测分析_大数据_05

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

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

spark如何进行数据预处理 spark预测分析_大数据_06

(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


spark如何进行数据预处理 spark预测分析_spark如何进行数据预处理_07

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

spark如何进行数据预处理 spark预测分析_spark_08

  • 评估模型
model.clearThreshold()
val scoreAndLabels = test.map{point =>
  val score = model.predict(point.features)
  score+" "+point.label
}
scoreAndLabels.foreach(println)


spark如何进行数据预处理 spark预测分析_分布式_09

  • 设定阈值0.0
model.setThreshold(0.0)
scoreAndLabels.foreach(println)


spark如何进行数据预处理 spark预测分析_spark_10

  • 清除阈值
model.clearThreshold()
val scoreAndLabels = test.map{point =>
  val score = model.predict(point.features)
  score+" "+point.label
}
scoreAndLabels.foreach(println)


spark如何进行数据预处理 spark预测分析_spark如何进行数据预处理_11

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

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

spark如何进行数据预处理 spark预测分析_字段_12

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

spark如何进行数据预处理 spark预测分析_spark_13

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

spark如何进行数据预处理 spark预测分析_spark_14

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

spark如何进行数据预处理 spark预测分析_大数据_15

  • 创建一个prop变量用来保存JDBC连接参数
val prop = new Properties()
prop.put("user", "root")
prop.put("password", "Admin123.")
prop.put("driver","com.mysql.jdbc.Driver")


spark如何进行数据预处理 spark预测分析_spark如何进行数据预处理_16

  • 连接数据库
rebuyDF.write.mode("append").jdbc("jdbc:mysql://localhost:3306/dbtaobao11", "dbtaobao11.rebuy", prop)
  • 查看数据库中的表rebuy前十行
use dbtaobao11;
select * from rebuy limit 11;


spark如何进行数据预处理 spark预测分析_字段_17