石家庄铁道大学2023年春季
2020 级课前测试试卷-电子商务大数据分析
课程名称:大型数据库应用技术 任课教师:王建民 测试时间:实现为止
测试要求:
一、测试要求:
1、 数据采集(要求至少爬取三千条记录,时间跨度超过一星期):(10分)
要求Python 编写程序爬取京东手机的评论数据,生成Json形式的数据文件。
京东商城部分数据格式如下图所示:
- "productCommentSummary": {
- "goodRateShow": 95, //好评率
- "poorRateShow": 3, //差评率
- "poorCountStr": "1900+",
- "averageScore": 5, //平均分
- "generalCountStr": "1600+",
- "oneYear": 0,
- "showCount": 21000,
- "showCountStr": "2.1万+",
- "goodCount": 64000, //好评数
- "generalRate": 0.024,
- "generalCount": 1600, //中评数
- "skuId": 4432058,
- "goodCountStr": "6.4万+",
- "poorRate": 0.028,
- "afterCount": 2400,
- "goodRateStyle": 142,
- "poorCount": 1900, //差评数
- "skuIds": null,
- "poorRateStyle": 4,
- "generalRateStyle": 4,
- "commentCountStr": "6.8万+",
- "commentCount": 68000,
- "productId": 4432058, //商品id
- "afterCountStr": "2400+",
- "goodRate": 0.948,
- "generalRateShow": 2 //中评率
- },
comments中一条评论的结构:
- “id": 10432588299,
- “guid": "6c1d83b1-ac45-4189-a041-774eaff87df9",
- “content": "割手,相当的割手,无语了", //评论内容 √
- “creationTime": "2017-05-22 23:37:24", //写评论的时间 √
- “isTop": false, //是否置顶
- “referenceTime": "2017-05-20 18:35:11", //收货时间 √
- “firstCategory": 9987, //第一分类 √
- “secondCategory": 653, //第二分类 √
- “thirdCategory": 655, //第三分类 √
- “replyCount": 0,
- “score": 3, //打分 √
- “nickname": "j***柜", //昵称 √
- “userClient": 2,
- “productColor": "碳黑色",
- “productSize": "32GB",
- “userLevelName": "金牌会员", //会员级别 √
- “plusAvailable": 0,
- “productSales": [
- {
- "dim": 3,
- "saleName": "选择套装",
- "saleValue": "官方标配"
- }
- ,
- “userClientShow": "来自京东iPhone客户端",//评论设备
- “isMobile": true, //是否移动端
- “days": 2, //评论时间距【收货/下单】时间多长时间
- “afterDays": 0
2、数据预处理:要求使用MapReduce或者kettle实现源数据的预处理,对大量的Json文件,进行清洗,以得到结构化的文本文件。(10分)
(1)去除用户评论表的重复记录;
(2)按照清洗后的数据格式要求提取相应的数据字段。
清洗后的标准文本格式:
- "id": 10432588299,
- "guid": "6c1d83b1-ac45-4189-a041-774eaff87df9",
- "content": "割手,相当的割手,无语了", //评论内容 √
- "creationTime": "2017-05-22 23:37:24", //写评论的时间 √
- "isTop": false, //是否置顶
- "referenceTime": "2017-05-20 18:35:11", //收货时间 √
- "score": 3, //打分 √
- "nickname": "j***柜", //昵称 √
- "userLevelName": "金牌会员", //会员级别 √
- "userClientShow": "来自京东iPhone客户端",//评论设备
- "isMobile": true, //是否移动端
- "days": 2, //评论时间距【收货/下单】时间多长时间
3、 数据统计:生成Hive用户评论数据:(15分)
(1)在Hive创建一张表,用于存放清洗后的数据,表名为pinglun,字段名、字符类型、字段解释如下:
- productid string 产品ID
- commentcount int 评论数
- goodcount int 好评数
- generalcount int 中评数
- poorcount int 差评数
- goodrateshow float 好评率
- generalrateshow float 中评率
- poorrateshow float 差评率
- guid string 随机生成ID
- content string 评论内容
- creationtime string 写评论的时间
- score int 打分
- nickname string 昵称
- userlevelname string 会员级别
- userclientshow string 评论设备
- ismobile string 是否移动端
- days int 评论时间距【收货/下单】时间多长时间
需求1:分析用户使用移动端购买还是PC端购买,及移动端和PC端的用户比例,生成ismobilehive表,存储统计结果;
安卓791,IOS193,PC7
需求2:分析用户评论周期(收到货后,一般多久进行评论),生成dayssql表,存储统计结果;
需求3:分析会员级别(判断购买此商品的用户级别),生成userlevelname_out表,存储统计结果;
需求4:分析每天评论量,生成creationtime_out表,存储统计结果;
需求5:日期格式标准化
功能为:去掉评论时间的时分秒,只保留年月日
4、 利用Sqoop进行数据迁移至Mysql数据库:(5分)
将上述五个表倒入到相对应的mysql数据表中。
5、 数据可视化:利用JavaWeb+Echarts完成数据图表展示过程(20分)
(实现前五步,获得60分)
需求1:把用户对京东进行评论时使用的是客户端还是移动端的统计数据,用饼图进行数据展示,从而达到让观者能从中熟悉某个项目与整个数据组间所存在的比例关系的目的。
var option = {
series : [
{
name: '访问来源',
type: 'pie', // 设置图表类型为饼图
radius: '55%', // 饼图的半径,外半径为可视区尺寸(容器高宽中较小一项)的 55% 长度。
data:xx
}
]
};
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
Connection con = conn.getConnection(); //连接类
// 你要执行的Sql语句
System.out.println("ok");
String sql = "select is_mobile,count from ismobilehive";
ArrayList<Map> res = new ArrayList<>();
//然后创建statement类对象,用来执行SQL语句
Statement statement = null; //Statement实现增删改查
try {
statement = con.prepareStatement(sql);
//最后设置Resultset类,用来存放获取的 结果集
ResultSet rs = statement.executeQuery(sql);
while(rs.next()){
Map<String,String> one = new HashMap<>();
one.put("name",rs.getString("is_mobile"));
one.put("value",rs.getString("count"));
res.add(one);
}
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(res);
String out= JSON.toJSONString(res);
response.getWriter().print(out);
需求2:把用户在收到货后,一般多久进行评论,即用户评论周期用柱状图展示,可以达到展现数据并将数据进行比较的目的。
var option = {
title: {
text: '时间间隔'
},
tooltip: {},
legend: {
data:['天']
},
xAxis: {
data: xx['x']
},
yAxis: {},
series: [{
name: '天',
type: 'bar',
data: xx['y']
}]
};
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
Connection con = conn.getConnection(); //连接类
// 你要执行的Sql语句
System.out.println("ok");
String sql = "SELECT DAY,num,IF(LENGTH(0+DAY)=LENGTH(DAY),DAY,3650) X FROM dayssql ORDER BY X+1";
Map res = new HashMap<String, Map>();
ArrayList<String> name = new ArrayList<>();
ArrayList<Integer> count = new ArrayList<>();
//然后创建statement类对象,用来执行SQL语句
Statement statement = null; //Statement实现增删改查
try {
statement = con.prepareStatement(sql);
//最后设置Resultset类,用来存放获取的 结果集
ResultSet rs = statement.executeQuery(sql);
while(rs.next()){
name.add(rs.getString("day"));
count.add(rs.getInt("num"));
}
} catch (SQLException e) {
e.printStackTrace();
}
res.put("x",name);
res.put("y",count);
System.out.println(res);
String out= JSON.toJSONString(res);
response.getWriter().print(out);
需求3:将购买某商品的用户级别进行统计的结果数据用饼状图展示,从而可以展现用户级别的比例构成关系,让观者能从中熟悉某个级别的用户数量与所有购买用户所存在的比例关系。
var option = {
series : [
{
name: '访问来源',
type: 'pie', // 设置图表类型为饼图
radius: '55%', // 饼图的半径,外半径为可视区尺寸(容器高宽中较小一项)的 55% 长度。
label: {
normal: {
show: true,
formatter: '{b}: {c}({d}%)' //自定义显示格式(b:name, c:value, d:百分比)
}
},
data:xx
}
]
};
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
Connection con = conn.getConnection(); //连接类
// 你要执行的Sql语句
System.out.println("ok");
String sql = "select level,num from userlevelname_out";
ArrayList<Map> res = new ArrayList<>();
//然后创建statement类对象,用来执行SQL语句
Statement statement = null; //Statement实现增删改查
try {
statement = con.prepareStatement(sql);
//最后设置Resultset类,用来存放获取的 结果集
ResultSet rs = statement.executeQuery(sql);
while(rs.next()){
Map<String,String> one = new HashMap<>();
one.put("name",rs.getString("level"));
one.put("value",rs.getString("num"));
res.add(one);
}
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(res);
String out= JSON.toJSONString(res);
response.getWriter().print(out);
需求4:将某件商品的每天的评论量的统计数据用折线图进行展现,可以展现出这个商品每天的评论量的变化趋势。
var option =
option = {
xAxis: {
type: 'category',
data: xx['x']
},
yAxis: {
type: 'value'
},
series: [{
data: xx['y'],
type: 'line',
}],
tooltip : {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
}
}
},
};
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
Connection con = conn.getConnection(); //连接类
// 你要执行的Sql语句
System.out.println("ok");
String sql = "SELECT creationTime,COUNT(creationTime) FROM COMMENT GROUP BY creationTime ORDER BY creationTime";
Map res = new HashMap<String, Map>();
ArrayList<String> name = new ArrayList<>();
ArrayList<Integer> count = new ArrayList<>();
//然后创建statement类对象,用来执行SQL语句
Statement statement = null; //Statement实现增删改查
try {
statement = con.prepareStatement(sql);
//最后设置Resultset类,用来存放获取的 结果集
ResultSet rs = statement.executeQuery(sql);
while(rs.next()){
name.add(rs.getString("creationTime"));
count.add(rs.getInt("COUNT(creationTime)"));
}
} catch (SQLException e) {
e.printStackTrace();
}
res.put("x",name);
res.put("y",count);
System.out.println(res);
String out= JSON.toJSONString(res);
response.getWriter().print(out);
标签:rs,res,ArrayList,华为,评论,statement,80,京东,out From: https://www.cnblogs.com/duanzheng/p/17128427.html