淘宝双十一数据的分析与预测

该实验通过Spark的机器学习库应用SVM进行分类,对test.csv和train.csv数据集进行预处理,移除无效数据。实验在Ubuntu上运行,涉及Hadoop、Spark、JDK和MySQL的配置。预测结果存储在MySQL的dbtaobao数据库中,过程中解决了Python版本、Numpy安装、Pyspark配置和JDBC驱动相关问题。
摘要由CSDN通过智能技术生成
  • 实验目的

综合运用大数据分析生态中的相关组件,完成具有移动综合性的大数据分析任务,了解大数据分析的基本流程。

  • 实验平台
  1. 操作系统:Ubuntukylin-18.04
  2. Spark版本: 单机版2.4.0
  3. Hadoop版本: 单机版3.1.3
  4. JDK版本:1.8
  5. MySQL:5.7
  6. Python:3.6

、实验内容

数据集中有test.csv和train.csv两个文件。本次实验使用Spark的机器学习库进行简单的分类操作,并将测试结果存入MySQL数据库中。如下图所示,本实验内容涉及了数据预处理、数据分析以及大数据分析系统与数据库之间的联动

 

这里先列出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. 环境配置
  • 虚拟机 + Ubuntu
  • 查看Ubuntu自带的Python版本
  • Spark + Hadoop
  • JDK
  • MySQL
  1. 数据集预处理
  • 去掉测试集test.csv中label是-1的数据
  • 去掉测试和训练数据集中表示字段名称的行(即第一行)
  • 将上述处理好的文件保存为:test_after.csv, train_after.csv
  1. 启动Hadoop
  • 在默认用户的根目录下创建dbtaobao子目录,并将解压后的训练集和测试集上传到HDFS的/dbtaobao/dataset目录下
  1. 启动MySQL服务
  • 创建数据库dbtaobao
  • 建立表格rebuy,包含score varchar(40), label varchar(40) 两个属性

使用以下命令安装MySQL:

sudo apt-get update

sudo apt-get install mysql-server -y

然后使用mysql --version查看版本

service mysql start

mysql -u root -p

create database dbtaobao;

use dbtaobao;

create table rebuy (score varchar(40),label varchar(40));

select * from rebuy

quit;

  1. 启动pyspark
  • 需提前安装numpy(请注意numpy版本与python版本的匹配)
  • 提前配置好spark与MySQL的JDBC驱动
  • 启动pyspark
  1. 使用支持向量机SVM分类器预测回头客
  • 导入需要的包,包括pyspark.mllib中相关的包,pyspark.sql中相关的包等
  • 从HDFS读取训练数据
  • 构建模型
  • 评估模型
  • 把结果添加到mysql数据库中
  • 代码如下
from pyspark.ml.classification import LinearSVC
from pyspark.ml.linalg import Vectors
from pyspark.sql import SparkSession,Row
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
def splitDF(x):
    rel={}
    rel['features']=Vectors.dense(int(x[0]),int(x[1]),int(x[2]),int(x[3]))
    rel['label']=int(x[4])
    return rel
spark=SparkSession.builder.master("local").appName("double11").getOrCreate()

training = spark.sparkContext.textFile("hdfs://localhost:9000dbtaobao/dataset/train_after.csv").map(lambda line:line.split(',')).map(lambda p:Row(**splitDF(p))).toDF()
testing = spark.sparkContext.textFile("hdfs://localhost:9000dbtaobao/dataset/test_after.csv").map(lambda line:line.split(',')).map(lambda p:Row(**splitDF(p))).toDF()

dsvc = LinearSVC(maxIter=10, regParam=0.1).setFeaturesCol("label").setFeaturesCol('features')

dsvcModel = dsvc.fit(training)
dsvcPredictions=dsvcModel.transform(testing)

preRel=dsvcPredictions.select("prediction","label","features").collect()
for item in preRel:
    print(str(item['label'])+','+str(item['features'])+',prediction'+str(item['prediction']))
#准确率
evaluator=MulticlassClassificationEvaluator().setLabelCol("label").setPredictionCol("prediction")
dAccuracy=evaluator.evaluate(dsvcPredictions)
print(dAccuracy)

四、实验可能会出现的问题

1.python版本选取问题:

python2和python3.10以上的版本不推荐选择,目前最合适的Python版本推荐3.6,性能比较稳定。

2.numpy安装问题:

在安装numpy中遇到了无法安装的问题,可以考虑5G网络或者提前下载镜像源解压。

3.在启动pyspark时,遇到了问题:

./bin/pyspark: line 45: python: command not found

env: ‘python’: No such file or directory

在命令行输入Python不存在,输入Python3进入Python,因此需要配置Spark python的环境变量,在~/.bashrc文件中添加:

export PYTHONPATH                 = $SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.10-src.zip:$PYTHONPATH    

export PYSPARK_PYTHON=python3

然后source ~/.bashrc,再次启动pyspark就可以进入pyspark。

4.最后一行代码报错:

rebuyDF.write.jdbc("jdbc:mysql://localhost:3306/dbtaobao",'dbtaobao.rebuy','append', prop)

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

说明缺少mysql-connector-java-5.1.40-bin.jar包,但是之前明明已经解压到/usr/local/spark/jars中,这时才发现解压后是一个mysql-connector-java-5.1.40目录,mysql-connector-java-5.1.40-bin.jar在这个目录里面,将这个jar包复制到/usr/local/spark/jars中即可。

5.部分用户可能会出现内存硬盘容量不够扩容后的问题,例如

dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.

针对该类问题,需要重新进行系统初始化。

update source list,

sudo gedit /etc/apt/sources.list

sudo apt-get update

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值