每天都有数据导入分区,不可能手动把数据导入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;
来源:oschina
链接:https://my.oschina.net/u/4434424/blog/3219343