项目讲解3

自古美人都是妖i 提交于 2020-04-06 12:36:45

每天都有数据导入分区,不可能手动把数据导入hive中,需要写一个shell脚本load_ods_table.sh

load_ods_table.sh脚本:

接下来做ETL

drop table ods_weblog_detail;
create table ods_weblog_detail(
valid           string, --有效标识
remote_addr     string, --来源IP
remote_user     string, --用户标识
time_local      string, --访问完整时间
daystr          string, --访问日期
timestr         string, --访问时间
month           string, --访问月
day             string, --访问日
hour            string, --访问时
request         string, --请求的url
status          string, --响应码
body_bytes_sent string, --传输字节数
http_referer    string, --来源url
ref_host        string, --来源的host
ref_path        string, --来源的路径
ref_query       string, --来源参数query
ref_query_id    string, --来源参数query的值
http_user_agent string --客户终端标识
)
partitioned by(datestr string);

在切分url时候,可以采用正则表达式,或者一个函数

函数:parse_url_tuple

传入url为:http_referer,把引号替换空,得到一个干净的url,然后在调用函数,

然后解析出host、path、query、queryid

as 后面为别名

parse得出的是一个数组,要把数组变成多个字段,就需要lateral view,就可以把数组看成为多个字段,类似于转置行转列

a.*为为原来表的所有字段

b.*为得出的数组

可以使用sql写一个脚本

etl_detail脚本
导入数据可能出现错误,会导致抽取的数据错误影响统计结果,因为运行时候不是报错,需要取排查

可以是写个脚本取查看某个字段偏差的较大,就应该取检查

有个环节叫做数据质量检查,写shell脚本,检查一些特定的表,比如正数出现负数,增长的出现减少这种明显错误

计算该处理批次(一天)中的各小时pvs

create tables dw_pvs_hour( month string,day string,hour string,pvs bigint )partitiined by (datestr string);

show tables;

insert into table shizhan.dw_pvs_hour partitioned (datestr='2013-9-18')

seletc a.month as month,a.day as day,a.hour as hour  ,count(1) as pvs  from ods_weblog_detail  a  

where a.datestr='2013-9-18'  group by a.month,a.day,a.hour;

按小时粒度统计各来访域名产生的pv数并排序

create table  dw_ref_host_visit_cnts_h(ref_host string,month string,day string,hour string,ref_host_cnts bigint);创建表

insert into table  dw_ref_host_visit_cnts_h partitioned (datestr=''2013-9-18);插入分区2013-9-18数据

seletc ref_host,month,day,hour,count(1) as ref_host_cnt  选择域名,月日时,记录数

from ods_weblog_detail 

group  by ref_host,month,day,hour

having ref_host is not null

order by hour asc,day asc,month acs,ref_hour_cnts desc;

查询出结果如下:

seletc * from dw_ref_host_visit_cnts_h limit 10;

接下来只需要把每个小时的域名点击量进行排序,相当于加一个尾列

seletc ref_host,ref_host_cnts,concat(month,day,hour),row_number() over(partiton by concat(month,day,hour) order by ,ref_host_cnts desc) as od

from dw_ref_host_visit_cnts_h

concat函数为把month,day,hour连接在一起

按照concat分区,把每个分区按照点击次数降序加入尾列

根据上述row_number的功能,可编写Hql取各小时的ref_host访问次数topn

insert into table zs. dw_pvs_refhost_topn partiton(datestr='2013-9-18')

seletc t.hour,t.od,t.ref_host,t.ref_host_cnts.

from (

seletc ref_host,ref_host_cnts,concat(month,day,hour),row_number() over(partiton by concat(month,day,hour) order by ,ref_host_cnts desc) as od

from dw_ref_host_visit_cnts_h

) t where od<=3;

 

 

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!