1、第11章华为P30手机评论画像分析Hadoop大数据原理与应用西安电子科技大学出版社【知识与能力要求】第11章 华为P30手机评论画像分析 11.1 需求分析 11.2 项目设计 11.3 项目环境搭建 11.4 数据采集与预处理 11.5 使用Hive分析数据 11.6 数据可视化11.1 需求分析 用户画像即用户信息标签化,是通过收集与分析消费者社会属性、生活习惯、消费行为等主要信息数据后,完美地抽象出一个用户的商业全貌,可以看作是企业应用大数据技术的基本方式。针对京东商城华为P30手机前100页的评论数据,进行用户画像分析,并对结论进行可视化呈现,最终得出评论时间在工作日、周末的分布情况
2、,以及评论时间在春夏秋冬四季的分布情况。11.2 项目设计 对华为P30手机评论数据的用户画像分析。项目使用专业工具进行数据采集,使用Excel和Kettle进行数据预处理,采用HDFS存储预处理后的手机评论数据,并导入Hive数据仓库进行数据分析,最后使用Sprint Boot和ECharts技术将结论可视化呈现。研究目的数据采集与预处理数据存储数据分析与挖掘结论可视化呈现11.3 项目环境搭建 项目在Linux环境下完成,假设有3台机器,在3台机器上分别完成以下内容:(1)搭建Linux集群,配置静态IP、修改主机名、编辑域名映射。(2)安装和配置Java。(3)安装和配置SSH免密登录。
3、(4)部署全分布模式Hadoop集群。(5)在Hadoop主节点上安装MySQL数据库,设置Hive连接的账号和密码。(6)部署Hive,采用MySQL作为Metastore的数据库。(7)在Hadoop主节点上安装Eclipse。(8)在Windows或Linux下安装Excel、ETL工具Kettle。11.4 数据采集与预处理11.4.1 去除无关数据列11.4.2 数据变换11.4.3 数据集成与清洗11.4.1 去除无关数据列 使用Excel去除多余无关数据列,得到的手机评论数据。11.4.2 数据变换 用户评论时间修改为数字类型,目的是方便利用Hive中的函数做时间运算。1.使用K
4、ettle新建转换 打开Kettle的Spoon图形界面工具,设计一个转换(Transfor-mation),选择“CSV文件输入”、“字段选择”、“JavaScript代码”和“Excel输出”4个组件,在每个组件上单击后,按住“Shift”按键拉出一根线到下一个组件,使各个组件数据连通。使用Spoon设计转换11.4.2 数据变换 2.设计“CSV文件输入”进入窗口【CSV文件输入】,执行如下操作:(1)为防止数据出现乱码,将文件编码设置为UTF-8。(2)首先单击按钮获取字段,会获取文件头部的列名,然后单击按钮预览,进行查看数据11.4.2 数据变换 3.设计“字段选择”进入窗口【选择/
5、改名值】。将字段“时间”改为英文字符如“time”,修改字段名称主要是因为JavaScript中汉字不能作为参数进行处理。11.4.2 数据变换 4.编写JavaScript代码 进入窗口【JavaScript代码】。在选项卡【Script 1】中,写入以下两行代码:var data1=time;var time1=time.getTime()/1000;其中,time.getTime()是将“yyyy-MM-dd HH:mm”的格式转化成数字类型并精确到毫秒,然后将得到的毫秒数值除以1000得到秒。11.4.2 数据变换 5.设计“Excel输出”进入窗口【Excel输出】,执行如下操作:(
6、1)在选项卡【文件】中设置Excel文件的输出位置。11.4.2 数据变换 5.设计“Excel输出”(2)在选项卡【字段】中,单击按钮获取字段,删除不需要的字段,编者只保留了两个字段:原始数据格式的字段和处理后的字段,目的是方便对比。11.4.3 数据集成与清洗 数据集成与清洗的操作步骤如下:(1)用Excel打开文件jd.csv,将文件中字段“时间”的值替换为上文产生的数字格式时间“time1”的值。(2)删除无关字段。(3)手工添加ID,在第一列插入递增数字,作为每一行数据的唯一标识。(4)将此文件另存为“jd_1.csv”,另存文件时将其编码设置为UTF-8。如果不采用字符编码UTF-
7、8,数据上传至HDFS后查看时会出现乱码现象。(5)使用记事本打开文件“jd_1.csv”,我们会发现文件内容中存在“.”形式的数据(6)使用文本文件自带的“替换”功能将“.”替换为“.”。jd_1.csv文件中数据之间的分隔符是Tab,如果不将多余的Tab删除,读取文件时会出现错误,造成数据不准确。最后将该文件重新重命名为jd.csv。11.5 使用Hive分析数据11.5.1 上传评论数据至HDFS11.5.2 在Hive中创建用户评论表并载入数据11.5.3 根据用户评论时间创建各种表11.5.4 创建评论画像表11.5.1 上传评论数据至HDFS将文件jd.csv上传至HDFS的目录/
8、data/jd下,按照以下步骤完成。(1)创建HDFS目录/data和/data/jd,使用的命令如下所示。hadoop fs-mkdir-p/data/jd(2)将文件jd.csv上传至HDFS的目录/data/jd下,使用的命令如下所示。hadoop fs-put jd.csv/data/jd(3)查看是否上传成功,使用的命令如下所示。hadoop fs-ls/data/jd11.5.2 在Hive中创建用户评论表并载入数据(1)创建用户评论表comments,其HiveQL语句如下所示。create external table comments(uid int,member strin
9、g,level string,comments string,datetime int,thumbsup string,commentnum string,attribute string)partitioned by(date_id string)row format delimited fields terminated by t;11.5.2 在Hive中创建用户评论表并载入数据(2)载入数据到comments,其HiveQL语句如下所示。ALTER TABLE comments DROP IF EXISTS PARTITION(date_id=jd);ALTER TABLE comme
10、nts ADD PARTITION(date_id=jd)LOCATION hdfs:/master:8020/data/jd;(3)可以使用HiveQL语句查看分区内的数据,例如语句:select*from comments where date_id=20190618;该项目中所用函数说明(部分)函数说明from_unixtime(unix_timestamp,format)把时间戳格式时间转化为年月日时分秒格式时间,参数要求为整数且单位为秒datediff(string enddate,string startdate)返回两个时间参数的相差天数pmod(int a,int b)pmod
11、(double a,double b)正取余函数,返回a除以b的余数的正值concat_ws(separator,string1,string2,.)特殊形式的concat(),分隔符将被加到被连接的字符串之间,如果分隔符是NULL,返回值也将为NULL;只要有一个字符串不是NULL,就不会返回NULL该项目中所用函数说明(部分)在Hive原生版本中,目前并没有返回星期几的函数,为了解决这个问题,除了利用Java自己编写UDF外,还可以利用现有Hive函数实现,例如语句:pmod(datediff(#date#,2012-01-01),7)其中,2012-01-01是星期日,该函数的返回值为“
12、0-6”,每个数字分别对应星期日至星期六。另外,对查出指定条件后的结果进行分组排名的方法有如下几种:(1)rank()over(partition),并列排名计数,如1、1、3。(2)dense_ rank()over(partition),并列排名不计数,如1、1、2。11.5.3 根据用户评论时间创建各种表1.创建评论工作日表根据用户评论的时间创建评论工作日表tb_a,判断是周末还是工作日。使用的具体HiveQL语句如下所示。create table if not exists tb_aasselect uid,case when weekday=0 or weekday=6 then w
13、eekend else Working days end as weekdayfrom(select uid,weekday,rank()over(partition by uid,weekday order by cnt desc)as rofrom(select uid,weekday,count(1)as cntfrom(select uid,pmod(datediff(from_unixtime(datatime),2012-01-01),7)as weekdayfrom commentswhere date_id=jd)tgroup by uid,weekday)t1)ttwhere
14、 ro=1;创建评论工作日表tb_a11.5.3 根据用户评论时间创建各种表 2.创建评论时间表 根据用户评论的时间创建评论时间表tb_b,将时间字段拆分为时间区间。使用的具体HiveQL语句如下所示。create table if not exists tb_basselect uid,stfrom(select uid,st,RANK()OVER(PARTITION BY uid,st ORDER BY cnt DESC)as rofrom(select uid,st,count(1)as cntfrom(select uid,case11.5.3 根据用户评论时间创建各种表when fr
15、om_unixtime(datatime,HH:MM)between 11:30 and 13:30 then 11:3013:30when from_unixtime(datatime,HH:MM)between 13:30 and 17:30 then 13:3017:30when from_unixtime(datatime,HH:MM)between 17:30 and 24:00 then 17:3024:00when from_unixtime(datatime,HH:MM)between 00:00 and 8:00 then 0:008:00when from_unixtime
16、(datatime,HH:MM)between 8:00 and 11:30 then 8:0011:30end stfrom comments as awhere a.date_id=jd)tgroup by uid,st)t1)ttwhere ro=1;创建评论时间表tb_b11.5.3 根据用户评论时间创建各种表3.创建评论季节表根据用户评论的时间创建评论季节表tb_c,统计用户评论的季节属性。使用的具体HiveQL语句如下所示。create table if not exists tb_casselect uid,concat_ws(|,collect_set(quanter)as q
17、uantersfrom(select uid,casewhen month(from_unixtime(datatime)between 3 and 4 then springwhen month(from_unixtime(datatime)between 5 and 9 then summerwhen month(from_unixtime(datatime)between 10 and 11 then autumnelse winterend quanterfrom commentswhere date_id=jd)tgroup by uid;创建评论季节表tb_c11.5.3 根据用户
18、评论时间创建各种表 4.创建评论年限表 根据用户评论的时间创建评论年限表tb_d,统计用户评论所在的时间年限。使用的具体HiveQL语句如下所示。create table if not exists tb_dasselect uid,concat_ws(|,collect_set(cast(year(from_unixtime(datetime)as string)as yearsfrom commentswhere date_id=jdgroup by uid;创建评论年限表tb_d11.5.4 创建评论画像表 1.查看各表关联后数据 通过查询语句,查看各表关联后的数据。HiveQL语句如下
19、所示。select jd as date_id,tb_a.uid as uid,tb_a.weekday as weekday,tb_b.st as st,tb_d.years as years,tb_c.quanters as quantersfrom tb_aleft outer join tb_b on tb_a.uid=tb_b.uidleft outer join tb_c on tb_a.uid=tb_c.uidleft outer join tb_d on tb_a.uid=tb_d.uid;查看各表关联后数据11.5.4 创建评论画像表 2.创建评论画像目标表 创建评论画像目标
20、表P30_image,使用的HiveQL语句如下所示。create table P30_image(data_modify int,uid string,weekday string,st string,years string,quanters string)partitioned by(date_id int);11.5.4 创建评论画像表 3.插入数据到评论画像目标表 将数据插入到/user/hive/warehouse/P30_image/20190812中,使用的HiveQL语句如下所示。insert overwrite directory/user/hive/warehouse/P
21、30_image/20190812select distinct 20190812 as date_id,tb_a.uid as uid,tb_a.weekday as weekday,tb_b.st as st,tb_d.years as years,tb_c.quanters as quantersfrom tb_aleft outer join tb_b on tb_a.uid=tb_b.uidleft outer join tb_c on tb_a.uid=tb_c.uidleft outer join tb_d on tb_a.uid=tb_d.uid;插入数据到评论画像目标表11.
22、5.4 创建评论画像表 3.插入数据到评论画像目标表 然后,使用以下两条语句将数据插入到评论画像目标表P30_image中。ALTER TABLE P30_image DROP IF EXISTS PARTITION(date_id=20190812);ALTER TABLE P30_image ADD PARTITION(date_id=20190812)LOCATION/user/hive/warehouse/P30_image/20190812;11.5.4 创建评论画像表 4.查看评论画像目标表数据 查看评论画像目标表加载后的数据,使用的HiveQL语句如下所示。select*from
23、 P30_image查看评论画像目标表数据11.6 数据可视化 本项目的数据可视化基于Spring Boot和EChars实现,读者可以登录Spring官网https:/start.spring.io/进行配置下载Spring Boot项目,例如项目使用的名称为“Portrait”。1.创建application.yml 使用Eclipse或者IDEA打开项目,在项目/src/main/resources下创建文件application.yml。代码附后 2.编写数据接口代码 项目采用前后分离的设计模式,Spring Boot提供访问接口,由页面发送请求,然后根据返回的数据渲染。代码附后 3.
24、编写页面渲染代码 代码附后Spring Boot项目“Portrait”整体结构application.yml完整代码hive:url:jdbc:hive2:/192.168.18.130:10000/hive driver-class-name:org.apache.hive.jdbc.HiveDriver type:com.alibaba.druid.pool.DruidDataSource user:hive password:xijing#下面为连接池的补充设置,应用到上面所有数据源中#初始化大小,最小,最大 initialSize:1 minIdle:3 maxActive:20#配
25、置获取连接等待超时的时间 maxWait:60000#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis:60000#配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis:30000 validationQuery:select 1testWhileIdle:true testOnBorrow:false testOnReturn:false#打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements:true maxPoolPre
26、paredStatementPerConnectionSize:20 connectionErrorRetryAttempts:0 breakAfterAcquireFailure:true#spring.thymeleaf.prefix:classpath:/templates/#spring.thymeleaf.suffix:.htmlspring:mvc:view:prefix:/templates/suffix:.html static-path-pattern:/static/*数据接口完整代码AutowiredQualifier(jdbcTemplate)private JdbcT
27、emplate jdbcTemplate;RequestMapping(/list)CrossOriginpublic Map list()String sql=select*from P30_image;ListMap maps=jdbcTemplate.queryForList(sql);ListMap list=new ArrayListMap();Integer weekendNum=0;Integer workingdaysNum=0;Integer springNum=0;Integer summerNum=0;Integer autumnNum=0;Integer winterN
28、um=0;Map mapList=new HashMap();for(int i=0;i maps.size();i+)Map map=maps.get(i);String key1=(String)map.get(P30_image.weekday);String key2=(String)map.get(P30_image.quanters);if(weekend.equals(key1)weekendNum+;if(Working days.equals(key1)workingdaysNum+;if(spring.equals(key2)springNum+;if(summer.equ
29、als(key2)summerNum+;数据接口完整代码 if(autumn.equals(key2)autumnNum+;if(winter.equals(key2)winterNum+;mapList.put(weekend,weekendNum);mapList.put(workingDays,workingdaysNum);mapList.put(spring,springNum);mapList.put(summer,summerNum);mapList.put(autumn,autumnNum);mapList.put(winter,winterNum);return mapLis
30、t;页面渲染完整代码$(function()var aa;var c=0;$.ajax(type:GET,url:http:/localhost:8080/list,dataType:json,contentType:application/json;charset=utf-8,data:,success:function(data)reqStatus=true;console.log(data);aa=data0;var dom=document.getElementById(container);var myChart=echarts.init(dom);var app=;console.
31、log(data.weekend);option=null;echars(data,myChart););)function formatData(data)function echars(data,myChart)var scaleData=name:weekend,value:data.weekend,name:Working days,value:data.workingDays,name:spring,value:data.spring,name:summer,value:data.spring,name:winter,value:data.winter,name:autumn,val
32、ue:data.autumn;console.log(scaleData);var rich=white:color:#ddd,align:center,padding:3,0 ;页面渲染完整代码 var placeHolderStyle=normal:label:show:false ,labelLine:show:false ,color:rgba(0,0,0,0),borderColor:rgba(0,0,0,0),borderWidth:0 ;【本章小结】本章针对京东商城华为P30手机前100页的评论数据,进行了用户画像分析,并对结论进行可视化呈现,最终得出评论时间在工作日、周末的分布情况,以及评论时间在春夏秋冬四季的分布情况。项目使用专业工具进行数据采集,使用Excel和Kettle进行数据预处理,采用HDFS存储预处理后的数据,并导入Hive数据仓库进行数据分析,最后使用Sprint Boot和ECharts技术将结论可视化呈现。【课后作业】思考题 1.结合自己专业领域,调研该领域常用的数据预处理方法、技术和工具。2.结合自己专业领域,调研该领域的统计分析方法、技术和工具。3.结合自己专业领域,调研该领域的数据可视化方法、技术和工具。THANKSHadoop大数据原理与应用西安电子科技大学出版社
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。