35. }
36. public String getEntry_page() { 37. return entry_page; 38. }
39. public void setEntry_page(String entry_page) { 40. this.entry_page = entry_page; 41. }
42. public String getLeave_page() { 43. return leave_page; 44. }
45. public void setLeave_page(String leave_page) { 46. this.leave_page = leave_page; 47. }
48. public String getVisit_page_num() { 49. return visit_page_num; 50. }
51. public void setVisit_page_num(String visit_page_num) { 52. this.visit_page_num = visit_page_num; 53. }
54. public String getIP_addr() { 55. return IP_addr; 56. }
57. public void setIP_addr(String iP_addr) { 58. IP_addr = iP_addr; 59. }
60. public String getReferal() { 61. return referal; 62. }
63. public void setReferal(String referal) { 64. this.referal = referal; 65. } 66.
67. @Override
68. public String toString() {
69. return session + \
70. + \
71. + \ 72. } 73. 74. 75. 76. }
第四次清洗日志产生的访问记录表结构如下图: SessionID 访问时间 离开时间 第一次访问最后一次访问的访问的IP 页面 页面 页面总数 /blog/me /home /blog/others /profile 5 10 6 Session1 Session2 Session3 2016-05-30 15:17:00 2016-05-30 14:17:00 2016-05-30 12:17:00 2016-05-30 15:19:00 2016-05-30 15:19:38 2016-05-30 15:40:00 192.168.12.13192.168.12.14/products /detail 192.168.12.15
以上就是要进行日志清洗的所有MapReduce程序,因为只是一个简单的演示,方法并没有做很好的抽象。
MapReduce Troubleshooting
指定某个文件夹路径下所有文件作为mapreduce的输入参数的解决方案。 1.hdfs的文件系统中的路径是支持正则表达式的
2.使用.setInputDirRecursive(job,true)方法,然后指定文件夹路径
在分布式环境下如何设置每个用户的SessionID
可以使用UUID,UUID是分布式环境下唯一的元素识别码,它由日期和时间,时钟序列,机器识别码(一般为网卡MAC地址)三部分组成。这样就保证了每个用户的SessionID的唯一性。
HIVE建立数据仓库
使用MapReduce清洗完日志文件后,我们就开始使用Hive去构建对应的数据仓库并使用HiveSql对数据进行
分析。而在本系统里,我们将使用星型模型来构建数据仓库的ODS(OperationalData Store)层。下面的命令我们可以通过启动Hive的hiveserver2服务器并使用beeline客户端进行操作或者直接写脚本去定时调度。
PageViews数据分析
PageViews的事实表和维度表结构
使用HIVE在数据仓库中创建PageViews的贴源数据表:
>> create table pageviews(session string,ip string,requestdate string,requesttime string,visitpage string, staytime string,step string) comment ?this is the table for pageviews? partitioned by(inputDate string) clustered by(session) sorted by(requestdate,requesttime) into 4 buckets row format delimited
fields terminated by ? ?;
将HDFS中的数据导入到HIVE的PageViews贴源数据表中
>> load data inpath ?/clickstream/pageviews? overwrite into table pageviews partition(inputDate=?2016-05-17?);
如果没有标示是在?Local?本地文件系统中,则会去HDFS中加载数据
根据具体的业务分析逻辑创建ODS层的PageViews事实表,并从PageViews的贴源表中导入数据
这里根据请求的页面URL来分组(clustered)是为了方便统计每个页面的PV
>> create table ods_pageviews(session string,ip string,viewtime string,visitpage string, staytime string,step string) partitioned by(inputDate string) clustered by(visitpage) sorted by(viewtime) into 4 buckets row format delimited fields terminated by ? ?;
>> insert into table ods_pageviews partition(inputDate='2016-05-17') select
pv.session,pv.ip,concat(pv.requestdate,\pageviews as pv where pv.inputDate='2016-05-17';
创建PageViews事实表的时间维度表并从当天的事实表里导入数据
>>create table ods_dim_pageviews_time(time string,year string,month string,day string,hour string,minutes string,seconds string) partitioned by(inputDate String) clustered by(year,month,day) sorted by(time) into 4 buckets row format delimited fields terminated by ' ';
>> insert overwrite table ods_dim_pageviews_time partition(inputDate='2016-05-17') select distinct pv.viewtime,
substring(pv.viewtime,0,4),substring(pv.viewtime,6,2),substring(pv.viewtime,9,2),substring(pv.viewtime,12,2),substring(pv.viewtime,15,2),substring(pv.viewtime,18,2) from ods_pageviews as pv;
创建PageViews事实表的URL维度表并从当天的事实表里导入数据
>> create table ods_dim_pageviews_url(visitpage string,host string,path string,query string) partitioned by(inputDate string) clustered by(visitpage) sorted by(visitpage) into 4 buckets row format delimited fields terminated by ' ';
>> insert into table ods_dim_pageviews_url partition(inputDate='2016-05-17') select distinct