模块C:数据挖掘(10分)
环境说明: 服务端登录地址详见各模块服务端说明。 补充说明:各主机可通过Asbru工具或SSH客户端进行SSH访问; Master节点MySQL数据库用户名/密码:root/123456(已配置远程连接); Hive的配置文件位于/opt/apache-hive-2.3.4-bin/conf/ Spark任务在Yarn上用Client运行,方便观察日志。 该模块均使用Scala编写,利用Spark相关库完成。
任务一:特征工程
剔除订单信息表与订单详细信息表中用户id与商品id不存在现有的维表中的记录,同时建议多利用缓存并充分考虑并行度来优化代码,达到更快的计算效果。
1、根据Hive的dwd库中相关表或MySQL中shtd_store中相关表(order_detail、sku_info),计算出与用户id为6708的用户所购买相同商品种类最多的前10位用户(只考虑他俩购买过多少个相同的商品,不考虑相同的商品买了多少次),将10位用户id进行输出,输出格式如下,将结果截图粘贴至报告中: 结果格式如下: -------------------相同种类前10的id结果展示为:-------------------- 1,2,901,4,5,21,32,91,14,52
2、根据Hive的dwd库中相关表或MySQL中shtd_store中相关商品表(sku_info),获取id、spu_id、price、weight、tm_id、category3_id 这六个字段并进行数据预处理,对price、weight进行规范化(StandardScaler)处理,对spu_id、tm_id、category3_id进行one-hot编码处理(若该商品属于该品牌则置为1,否则置为0),并按照id进行升序排序,在集群中输出第一条数据前10列(无需展示字段名),将结果截图粘贴至报告中。
字段 | 类型 | 中文含义 | 备注 |
---|
id | double | 主键 | | price | double | 价格 | | weight | double | 重量 | | spu_id#1 | double | spu_id 1 | 若属于该spu_id,则内容为1否则为0 | spu_id#2 | double | spu_id 2 | 若属于该spu_id,则内容为1否则为0 | … | double | | | tm_id#1 | double | 品牌1 | 若属于该品牌,则内容为1否则为0 | tm_id#2 | double | 品牌2 | 若属于该品牌,则内容为1否则为0 | …… | double | | | category3_id#1 | double | 分类级别3 1 | 若属于该分类级别3,则内容为1否则为0 | category3_id#2 | double | 分类级别3 2 | 若属于该分类级别3,则内容为1否则为0 | …… | | | |
答案格式如下: --------------------第一条数据前10列结果展示为:--------------------- 1.0,0.89,0.72,0.0,0.0,0.0,0.0,1.0,0.0,0.0
任务二:推荐系统
1、根据任务一的结果,计算出与用户id为6708的用户所购买相同商品种类最多的前10位用户id(只考虑他俩购买过多少个相同的商品,不考虑相同的商品买了多少次),并根据Hive的dwd库中相关表或MySQL数据库shtd_store中相关表,获取到这10位用户已购买过的商品,并剔除用户6708已购买的商品,通过计算这10位用户已购买商品与该数据集中商品的余弦相似度累加再求均值,输出相似度前5商品id作为推荐使用,将执行结果截图粘贴至对应报告中。
结果格式如下: ------------------------推荐Top5结果如下------------------------ 相似度top1(商品id:1,平均相似度:0.98) 相似度top2(商品id:71,平均相似度:0.78) 相似度top3(商品id:22,平均相似度:0.76) 相似度top4(商品id:351,平均相似度:0.73) 相似度top5(商品id:14,平均相似度:0.52)
模块D:数据采集与实时计算(20分)
环境说明: 服务端登录地址详见各模块服务端说明。 补充说明:各主机可通过Asbru工具或SSH客户端进行SSH访问; 请先检查ZooKeeper、Kafka、Redis端口是否已启动,若未启动则各启动命令如下: ZK启动(netstat -ntlp查看2181端口是否打开) /usr/zk/zookeeper-3.4.6/bin/zkServer.sh start Redis启动(netstat -ntlp查看6379端口是否打开) /usr/redis/bin/redis-server /usr/redis/bin/redis.conf Kafka启动(netstat -ntlp查看9092端口是否打开) /opt/kafka/kafka_2.11-2.0.0/bin/kafka-server-start.sh -daemon(空格连接下一行)/opt/kafka/kafka_2.11-2.0.0/config/server.properties Flink任务在Yarn上用per job模式(即Job分离模式,不采用Session模式),方便Yarn回收资源。
任务一:实时数据采集
1、在Master节点使用Flume采集实时数据生成器10050端口的socket数据,将数据存入到Kafka的Topic中(Topic名称为order,分区数为4),使用Kafka自带的消费者消费order(Topic)中的数据,将前2条数据的结果截图粘贴至对应报告中; 2、采用多路复用模式,Flume接收数据注入kafka 的同时,将数据备份到HDFS目录/user/test/flumebackup下,将查看备份目录下的第一个文件的前2条数据的命令与结果截图粘贴至对应报告中。
任务二:使用Flink处理Kafka中的数据
编写Scala代码,使用Flink消费Kafka中Topic为order的数据并进行相应的数据统计计算(订单信息对应表结构order_info,订单详细信息对应表结构order_detail(来源类型和来源编号这两个字段不考虑,所以在实时数据中不会出现),同时计算中使用order_info或order_detail表中create_time或operate_time取两者中值较大者作为EventTime,若operate_time为空值或无此属性,则使用create_time填充,允许数据延迟5S,订单状态分别为1001:创建订单、1002:支付订单、1003:取消订单、1004:完成订单、1005:申请退回、1006:退回完成。另外对于数据结果展示时,不要采用例如:1.9786518E7的科学计数法)。 1、使用Flink消费Kafka中的数据,统计商城实时订单实收金额(需要考虑订单状态,若有取消订单、申请退回、退回完成则不计入订单实收金额,其他状态的则累加),将key设置成totalprice存入Redis中。使用redis cli以get key方式获取totalprice值,将结果截图粘贴至对应报告中,需两次截图,第一次截图和第二次截图间隔1分钟以上,第一次截图放前面,第二次截图放后面; 2、在任务1进行的同时,使用侧边流,监控若发现order_status字段为退回完成, 将key设置成totalrefundordercount存入Redis中,value存放用户退款消费额。使用redis cli以get key方式获取totalrefundordercount值,将结果截图粘贴至对应报告中,需两次截图,第一次截图和第二次截图间隔1分钟以上,第一次截图放前面,第二次截图放后面; 3、在任务1进行的同时,使用侧边流,监控若发现order_status字段为取消订单,将数据存入MySQL数据库shtd_result的order_info表中,然后在Linux的MySQL命令行中根据id降序排序,查询列id、consignee、consignee_tel、final_total_amount、feight_fee,查询出前5条,将SQL语句与执行结果截图粘贴至对应报告中。
|