四、将数据从 Hive 导入到 MySQL
4.1 Hive 预操作
4.1.1 创建临时表
创建临时表 inner_user_log 和 inner_user_info.
图 4.1
4.1.2 数据插入
将 user_log 表中的数据插入到 inner_user_log。
图 4.2
4.1.3 查看是否成功执行
图 4.3
4.2 使用 Sqoop 将数据从 Hive 导入 MySQL
4.2.1 创建数据库
图 4.4
4.2.2 创建表
图 4.5
4.2.3 导入数据
输入指令如图 4.6:
图 4.6
结果输出如图 4.7:
图 4.7
4.2.4 查看 MySQL 中 user_log 表中的数据
图 4.8
可以看到数据已经成功从 Hive 导入到 MySQL 中了。
五、利用 Spark 预测回头客
5.1 预处理 test.csv 和 train.csv 数据集
5.1.1 新建 predeal_test.sh 脚本文件
预先处理 test.csv 数据集,把这 test.csv 数据集里 label 字段表示-1 值剔除掉,保留需要预测的数据.并假设需要预测的数据中 label 字段均为 1,也就是对应回头客的数据。
其中 if($1 && $2 && $3 && $4 && !$5)对应 test.csv 中的五个字段值。
图 5.1
5.1.2 执行 predeal_test.sh 脚本
执行 predeal_test.sh 脚本文件,截取测试数据集需要预测的数据到 test_after.csv 文件。
图 5.2
5.1.3 train.csv 文件预处理
train.csv 的第一行都是字段名称,不需要第一行字段名称,这里在对 train.csv 做数据预处理时,删除第一行
图 5.3
5.1.4 新建 predeal_train.sh 脚本文件
图 5.4
5.1.5 执行 predeal_train.sh 脚本文件
执行脚本,截取测试数据集需要预测的数据到 train_after.csv 文件。
图 5.5
5.2 预测回头客
5.2.1 启用 Hadoop
通过 Hadoop 将 train_after.csv 和 test_after.csv 两个数据集分别存取到 HDFS 中。
图 5.6
5.2.2 进入 MySQL Shell
图 5.7
5.2.3 创建回头客预测表 rebuy
图 5.8
5.2.4 启动 Spark Shell
通过 JDBC 方式连接到 MySQL 数据库获取数据生成 DataFrame。
图 5.9
Spark 启动成功:
图 5.10
5.2.5 使用支持向量机 SVM 分类器预测回头客
导入所需的包
图 5.11
读取训练文本文件和测试文本文件
- 图 5.12
- 构建模型
- 构建数据集
图 5.13
这里通过 map 将每行的数据用“,”隔开,在数据集中,每行被分成了 5 部分,前 4 部分是用户交易的 3 个特征(age_range,gender,merchant_id),最后一部分是用户交易的分类(label)。把这里我们用 LabeledPoint 来存储标签列和特征列。LabeledPoint 在监督学习中常用来存储标签和特征,其中要求标签的类型是 double,特征的类型是 Vector。
构建模型 SVMWithSGD
SGD 即随机梯度下降算法,设置迭代次数为 1000。生成的模型用 model 变量保存。
- 图 5.14
- 评估模型
- 清除默认阈值,这样会输出原始的预测评分,即带有确信度的结果。
图 5.15
如果我们设定了阀值,则会把大于阈值的结果当成正预测,小于阈值的结果当成负预测。
比如我们设置阈值为 0.0:
图 5.16
此时输出结果:
- 图 5.17
- 将结果写入 MySQL 数据库
- 在不设置阈值的情况下将测试集结果存入到 MySQL 数据表 rebuy 中。通过以下步骤逐步完成。
- 清除阈值
图 5.18
将测试数据通过 map 使用 model 模型进行预测并存储在 scoreAndLabels 中
图 5.19
设置回头客数据,将数据集用空格分开
图 5.20
设置模式信息
图 5.21
创建 Row 对象,每个 Row 对象都是 rowRDD 中的一行
图 5.22
建立起 Row 对象和模式之间的对应关系,也就是把数据 rowRDD 和模式 schema 对应起来
图 5.23
创建一个 prop 变量用来保存 JDBC 连接参数,并设置驱动程序
图 5.24
连接数据库,采用 append 模式,表示追加记录到数据库 dbtaobao 的 rebuy 表中
图 5.25
执行结果
图 5.26
六、利用 ECharts 进行数据可视化分析
ECharts 是一个基于 JavaScript 的数据可视化图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari 等),提供直观,生动,可交互,可高度个性化定制的数据可视化图表。
由于 ECharts 是运行在网页前端,选用 JSP 作为服务端语言,读取 MySQL 中的数据,然后渲染到前端页面,因此还需要 Tomcat 作为 Web 服务器。
6.1 搭建 Tomcat+MySQL+JSP 开发环境
6.1.1 下载 Tomcat 安装包
案例中使用的是 v8.0.47,实际操作时选择的 Tomcat 版本为 8.0.53。
图 6.1
6.1.2 启动 MySQL
图 6.2
6.2 利用 Eclipse 新建可视化 Web 应用
6.2.1 在 Eclipse 中安装必要的 Web 组件
图 6.3
6.2.2 新建 Dynamic Web Project
配置 runtime 为 Tomcat v8.0。
图 6.4
6.2.3 添加 mysql-connector-java-5.1.47-bin.jar 连接驱动
图 6.5
6.2.4 利用 Eclipse 开发 Dynamic Web Project 应用
构建项目文件和代码,注意 MySQL 连接参数配置正确
图 6.6
关键功能代码:
数据库连接通过 JDBC,获取需要的数据则通过 select 指令配合 group by 完成。
连接 MySQL 数据库
图 6.7
所有买家不同消费行为比例
图 6.8
男女买家交易量对比
图 6.9
男女买家各个年龄段交易对比
图 6.10
销量前十的商品类别对比
图 6.11
各年龄段交易比例
图 6.12
各个省份的的总成交量对比
图 6.13
6.3 启动项目
6.3.1 启动 Server
双击 index.jsp,选择 run as->run on server 开始运行项目。
图 6.14
6.3.2 在 Web Browser 浏览运行结果
这里进行了五种统计,分别展示了所有买家消费比例、男女买家交易量比例、男女买家各年龄段交易对比、各年龄段交易比例、销量前十商品对比、全国各省成交量分布。
其中销量前十商品图相比案例中稍作了一点修改,各年龄段交易比例和全国各省成交量分布则是自己实现的,所以着重写一下这 3 个。
所有买家消费行为比例图
使用饼图进行展示,通过查询 action 字段获取,包含点击、添加购物车、特别关注、购买四种行为,其中点击比例达到八成,占绝大多数。
- 图 6.15
- 男女买家交易对比图
- 使用饼图展示,通过查询 gender 字段获取,包含男性、女性、未知三种分布。
- 图 6.16
- 男女买家各个年龄段交易对比图
- 使用散点图展示,并将男性和女性用两种颜色的图例区分开,通过查询 gender 字段、age_range 字段获取,横轴是不同年龄段,纵轴是交易记录数。
图 6.17
销售前十商品类别图
使用柱状图展示,案例教程中是只获取了销售前五的商品数据,这里为了对比更加清晰鲜明,获取的是前十的数据,在柱状图上方加了图例,并将数据按降序全部展示出来,数据通过 cat_id 字段结合 select、group by、limit 等指令完成:
select cat_id,count() num from user_log group by cat_id order by count() desc limit 10;
横轴展示的是商品 id,纵轴是销售量。可以看到第一的商品和第十的商品销量差距接近一倍,还是差别挺大的。
图 6.18
各年龄段交易比例
这个是自己根据需求实现的,案例教程中没有。主要目的是想看一下买家中什么年龄段在双十一那天最活跃,因而选择了环形图,比较清晰。获取的方式也是通过 age_range 字段:
selectage_range,count(*)numfromuser_loggroupbyage_rangedesc;
由于截取的数据记录量只有 10000 条,所以差距不是很大,不过也可以看出 18~24 岁年龄段相对更活跃,这也和大学生消费需求较大有关;另外 25~29 岁年龄段也很活跃,这可能因为这部分人都工作了几年,有了一定的消费力,同时又比较年轻,接受能力强,所以消费力比较高。
图 6.19
各省份成交量对比
案例教程中有提到这个分布图,不过没有给出代码,此处自己进行了实现。主要目的是看一下全国双十一活跃度分布情况,通过 province 字段获取数据。
首先左下角是一个连续型的 visualMap 视觉映射组件,代码中会实时根据数据的分布改变 max 值和 min 值。另外为了和 china.js 的地图数据匹配,代码中也将四个直辖市(上海市、重庆市、北京市、天津市)中的“市”截掉,从而与地图中的(上海、重庆、北京、天津)匹配。
关键代码如下:
图 6.20
通过分布看出,南方的活跃度还是相对高于北方,沿海活跃度相对高于内陆,这可能和省市的经济发展状况以及人们的平均生活水平有关。
图 6.21