文章目录

  • 1 多维度统计PV总量
    • 按时间维度
    • 按终端维度
    • 按栏目维度
    • 按referer维度
    • 人均浏览量
    • 统计pv总量最大的来源TOPN (分组TOP)
  • 2 受访分析(从页面的角度分析)
    • 各页面访问统计
    • 热门页面统计
  • 3 访客分析
    • 独立访客
    • 每日新访客
  • 4 访客Visit分析(点击流模型)
    • 回头/单次访客统计
    • 人均访问频次
  • 5 关键路径转化率分析(漏斗模型)
    • 需求分析
    • 模型设计
    • 开发实现

文章目录

  • 1 多维度统计PV总量
    • 按时间维度
    • 按终端维度
    • 按栏目维度
    • 按referer维度
    • 人均浏览量
    • 统计pv总量最大的来源TOPN (分组TOP)
  • 2 受访分析(从页面的角度分析)
    • 各页面访问统计
    • 热门页面统计
  • 3 访客分析
    • 独立访客
    • 每日新访客
  • 4 访客Visit分析(点击流模型)
    • 回头/单次访客统计
    • 人均访问频次
  • 5 关键路径转化率分析(漏斗模型)
    • 需求分析
    • 模型设计
    • 开发实现

数据仓库建设好以后,用户就可以编写Hive SQL语句对其进行访问并对其中数据进行分析。
在实际生产中,究竟需要哪些统计指标通常由数据需求相关部门人员提出,而且会不断有新的统计需求产生,以下为网站流量分析中的一些典型指标示例。
注:每一种统计指标都可以跟各维度表进行钻取。

1 多维度统计PV总量

按时间维度

计算每小时pvs,注意gruop by语法
select count(*) as pvs,month,day,hour from ods_weblog_detail group by month,day,hour;

直接在ods_weblog_detail单表上进行查询

--计算该处理批次(一天)中的各小时pvs
drop table dw_pvs_everyhour_oneday;
create table dw_pvs_everyhour_oneday(month string,day string,hour string,pvs bigint) partitioned by(datestr string);insert into table dw_pvs_everyhour_oneday partition(datestr='20130918')
select a.month as month,a.day as day,a.hour as hour,count(*) as pvs from ods_weblog_detail a
where  a.datestr='20130918' group by a.month,a.day,a.hour;--计算每天的pvs
drop table dw_pvs_everyday;
create table dw_pvs_everyday(pvs bigint,month string,day string);insert into table dw_pvs_everyday
select count(*) as pvs,a.month as month,a.day as day from ods_weblog_detail a
group by a.month,a.day;

按终端维度

数据中能够反映出用户终端信息的字段是http_user_agent。
User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。例如:
User-Agent,Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.276 Safari/537.36
上述UA信息就可以提取出以下的信息:
chrome 58.0、浏览器 chrome、浏览器版本 58.0、系统平台 windows
浏览器内核 webkit
可以用下面的语句进行试探性统计,当然这样的准确度不是很高。

select distinct(http_user_agent) from ods_weblog_detail where http_user_agent like '%Chrome%' limit 200;

按栏目维度

网站栏目可以理解为网站中内容相关的主题集中。体现在域名上来看就是不同的栏目会有不同的二级目录。比如某网站网址为www.xxxx.cn,旗下栏目可以通过如下方式访问:
栏目维度:…/job
栏目维度:…/news
栏目维度:…/sports
栏目维度:…/technology
那么根据用户请求url就可以解析出访问栏目,然后按照栏目进行统计分析。

按referer维度

--统计每小时各来访url产生的pv量
drop table dw_pvs_referer_everyhour;
create table dw_pvs_referer_everyhour(referer_url string,referer_host string,month string,day string,hour string,pv_referer_cnt bigint) partitioned by(datestr string);insert into table dw_pvs_referer_everyhour partition(datestr='20130918')
select http_referer,ref_host,month,day,hour,count(1) as pv_referer_cnt
from ods_weblog_detail
group by http_referer,ref_host,month,day,hour
having ref_host is not null
order by hour asc,day asc,month asc,pv_referer_cnt desc;--统计每小时各来访host的产生的pv数并排序
drop table dw_pvs_refererhost_everyhour;
create table dw_pvs_refererhost_everyhour(ref_host string,month string,day string,hour string,ref_host_cnts bigint) partitioned by(datestr string);insert into table dw_pvs_refererhost_everyhour partition(datestr='20130918')
select ref_host,month,day,hour,count(1) as ref_host_cnts
from ods_weblog_detail
group by ref_host,month,day,hour
having ref_host is not null
order by hour asc,day asc,month asc,ref_host_cnts desc;

人均浏览量

需求描述:统计今日所有来访者平均请求的页面数。
人均浏览量也称作人均浏览页数,该指标可以说明网站对用户的粘性。
人均页面浏览量表示用户某一时段平均浏览页面的次数。
计算方式:总页面请求数/去重总人数
remote_addr表示不同的用户。可以先统计出不同remote_addr的pv量,然后累加(sum)所有pv作为总的页面请求数,再count所有remote_addr作为总的去重总人数。

–总页面请求数/去重总人数

drop table dw_avgpv_user_everyday;
create table dw_avgpv_user_everyday(
day string,
avgpv string);insert into table dw_avgpv_user_everyday
select '20130918',sum(b.pvs)/count(b.remote_addr) from
(select remote_addr,count(1) as pvs from ods_weblog_detail where datestr='20130918' group by remote_addr) b;

统计pv总量最大的来源TOPN (分组TOP)

需求描述:统计每小时各来访host的产生的pvs数最多的前N个(topN)。
row_number()函数
 语法:row_number() over (partition by xxx order by xxx) rank,rank为分组的别名,相当于新增一个字段为rank。
 partition by用于分组,比方说依照sex字段分组
 order by用于分组内排序,比方说依照sex分组,组内按照age排序
 排好序之后,为每个分组内每一条分组记录从1开始返回一个数字
 取组内某个数据,可以使用where 表名.rank>x之类的语法去取
以下语句对每个小时内的来访host次数倒序排序标号:

select ref_host,ref_host_cnts,concat(month,day,hour),
row_number() over (partition by concat(month,day,hour) order by ref_host_cnts desc) as od from dw_pvs_refererhost_everyhour;

2 受访分析(从页面的角度分析)

各页面访问统计

主要是针对数据中的request进行统计分析,比如各页面PV ,各页面UV 等。
以上指标无非就是根据页面的字段group by。例如:

–统计各页面pv

select request as request,count(request) as request_counts from
ods_weblog_detail group by request having request is not null order by request_counts desc limit 20;

热门页面统计

–统计每日最热门的页面top10

drop table dw_hotpages_everyday;
create table dw_hotpages_everyday(day string,url string,pvs string);insert into table dw_hotpages_everyday
select '20130918',a.request,a.request_counts from
(select request as request,count(request) as request_counts from ods_weblog_detail where datestr='20130918' group by request having request is not null) a
order by a.request_counts desc limit 10;

3 访客分析

独立访客

需求描述:按照时间维度比如小时来统计独立访客及其产生的pv。
对于独立访客的识别,如果在原始日志中有用户标识,则根据用户标识即很好实现;此处,由于原始日志中并没有用户标识,以访客IP来模拟,技术上是一样的,只是精确度相对较低。

--时间维度:时
drop table dw_user_dstc_ip_h;
create table dw_user_dstc_ip_h(
remote_addr string,
pvs      bigint,
hour     string);insert into table dw_user_dstc_ip_h
select remote_addr,count(1) as pvs,concat(month,day,hour) as hour
from ods_weblog_detail
Where datestr='20130918'
group by concat(month,day,hour),remote_addr;在此结果表之上,可以进一步统计,如每小时独立访客总数:
select count(1) as dstc_ip_cnts,hour from dw_user_dstc_ip_h group by hour;--时间维度:日
select remote_addr,count(1) as counts,concat(month,day) as day
from ods_weblog_detail
Where datestr='20130918'
group by concat(month,day),remote_addr;--时间维度:月
select remote_addr,count(1) as counts,month
from ods_weblog_detail
group by month,remote_addr;

每日新访客

需求:将每天的新访客统计出来。
实现思路:创建一个去重访客累积表,然后将每日访客对比累积表。

4 访客Visit分析(点击流模型)

回头/单次访客统计

需求:查询今日所有回头访客及其访问次数。

实现思路:上表中出现次数>1的访客,即回头访客;反之,则为单次访客。

drop table dw_user_returning;
create table dw_user_returning(
day string,
remote_addr string,
acc_cnt string)
partitioned by (datestr string);insert overwrite table dw_user_returning partition(datestr='20130918')
select tmp.day,tmp.remote_addr,tmp.acc_cnt
from
(select '20130918' as day,remote_addr,count(session) as acc_cnt from ods_click_stream_visit group by remote_addr) tmp
where tmp.acc_cnt>1;

人均访问频次

需求:统计出每天所有用户访问网站的平均次数(visit)
总visit数/去重总用户数

select count(pagevisits)/count(distinct remote_addr) from ods_click_stream_visit where datestr='20130918';

5 关键路径转化率分析(漏斗模型)

需求分析

转化:在一条指定的业务流程中,各个步骤的完成人数及相对上一个步骤的百分比。

模型设计

定义好业务流程中的页面标识,下例中的步骤为:
Step1、 /item
Step2、 /category
Step3、 /index
Step4、 /order

开发实现

查询每一个步骤的总访问人数

--查询每一步人数存入dw_oute_numbs
create table dw_oute_numbs as
select 'step1' as step,count(distinct remote_addr)  as numbs from ods_click_pageviews where datestr='20130920' and request like '/item%'
union
select 'step2' as step,count(distinct remote_addr)  as numbs from ods_click_pageviews where datestr='20130920' and request like '/category%'
union
select 'step3' as step,count(distinct remote_addr)  as numbs from ods_click_pageviews where datestr='20130920' and request like '/order%'
union
select 'step4' as step,count(distinct remote_addr)  as numbs from ods_click_pageviews where datestr='20130920' and request like '/index%';
注:UNION将多个SELECT语句的结果集合并为一个独立的结果集。查询每一步骤相对于路径起点人数的比例
思路:级联查询,利用自join--dw_oute_numbs跟自己join
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from dw_oute_numbs rn
inner join
dw_oute_numbs rr;--每一步的人数/第一步的人数==每一步相对起点人数比例
select tmp.rnstep,tmp.rnnumbs/tmp.rrnumbs as ratio
from
(
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from dw_oute_numbs rn
inner join
dw_oute_numbs rr) tmp
where tmp.rrstep='step1';查询每一步骤相对于上一步骤的漏出率--自join表过滤出每一步跟上一步的记录
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from dw_oute_numbs rn
inner join
dw_oute_numbs rr
where cast(substr(rn.step,5,1) as int)=cast(substr(rr.step,5,1) as int)-1;select tmp.rrstep as step,tmp.rrnumbs/tmp.rnnumbs as leakage_rate
from
(
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from dw_oute_numbs rn
inner join
dw_oute_numbs rr) tmp
where cast(substr(tmp.rnstep,5,1) as int)=cast(substr(tmp.rrstep,5,1) as int)-1;汇总以上两种指标
select abs.step,abs.numbs,abs.rate as abs_ratio,rel.rate as leakage_rate
from
(
select tmp.rnstep as step,tmp.rnnumbs as numbs,tmp.rnnumbs/tmp.rrnumbs as rate
from
(
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from dw_oute_numbs rn
inner join
dw_oute_numbs rr) tmp
where tmp.rrstep='step1'
) abs
left outer join
(
select tmp.rrstep as step,tmp.rrnumbs/tmp.rnnumbs as rate
from
(
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from dw_oute_numbs rn
inner join
dw_oute_numbs rr) tmp
where cast(substr(tmp.rnstep,5,1) as int)=cast(substr(tmp.rrstep,5,1) as int)-1
) rel
on abs.step=rel.step;

使用Hive SQL语句统计分析相关推荐

  1. beeline执行sql语句_由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考...

    背景 我们使用的HiveServer2的版本为0.13.1-cdh5.3.2,目前的任务使用Hive SQL构建,分为两种类型:手动任务(临时分析需求).调度任务(常规分析需求),两者均通过我们的We ...

  2. Hive SQL语句的正确执行顺序

    前言:hive的执行顺序也是总结mapreduce的执行顺序!!! 关于 sql 语句的执行顺序网上有很多资料,但是大多都没进行验证,并且很多都有点小错误,尤其是对于 select 和 group b ...

  3. hive sql 语句正确执行顺序

    网上对select 和group by的执行顺有不同的说法,很容易让人挠头,这里通过代码成功验证 : group by>select 正确的执行顺序: from ..on .. join .. ...

  4. Hive sql语句必练50题

    1016 HQL36-50题 36.查询任何一门课程成绩在70分以上的姓名.课程名称和分数: select st.s_name,c.c_name,s_score from student st joi ...

  5. 记录hive sql报错,return code1和return code2解决方法

    执行hive sql语句的时候非常容易出现return code 1.return code 2.return code 3的情况,我就遇到了很多次,code3在某次意外中得以解决 但是引发了code ...

  6. 通过hive sql实现报表中的MTD,YTM,YTD

    MTD:例:20160918求20160901-20160918的amount的sum(累加) YTD: 例:20160918求20160101-20160918的amount的sum(累加) YTM ...

  7. Hive SQL数据查询基础

    教材第四章Hive SQL数据查询基础实验 提示:如果感觉sogou.500w.utf8文件太大,执行hive命令太耗时间,可以执行以下命令,截取前1万行数据,生成一个新的数据文件sogou.1w.u ...

  8. hive sql数据分析面试整理

    1.写作目的说明 hive sql是从事数据分析的同学的基本功.无论是秋招.春招或者是实习,sql都是面试官考察的重点,拿刚刚过去的19秋招来说,搜狐.网易.京东等在数据分析师岗位面试时都考了sql, ...

  9. 【数据分析师求职面试指南】必备编程技能整理之Hive SQL必备用法

    文章目录 熟悉Python 懂R语言 掌握SQL 大数据基础 数据库常用类型 多表查询 更多 聚合函数 distinct case when 窗口函数 动态更新 一行变多行 调优 内容整理自<拿 ...

最新文章

  1. Spring Boot与Redis的集成
  2. MySQL百万级、千万级数据多表关联SQL语句调优
  3. 面试题-Category(分类)
  4. 自动化运维之PSSH
  5. Intel® oneAPI Toolkit编译VASP
  6. 基于visual graph开发实时线损管理系统
  7. 推荐搜索炼丹笔记:向量召回 MIND多兴趣双塔模型
  8. Linux(六) 磁盘与文件系统
  9. fabric.js和高级画板
  10. STM32+L298N+PWM可调速小车(四驱)
  11. Win10系统安装教程
  12. 关于sinx交换积分次序变号的问题
  13. python selenium 验证码识别_Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录...
  14. 流式传输 android,如何从android流式传输到ffserver
  15. oracle11g 网页账号,oracle11g 创建用户并受权
  16. juniper服务器连接显示都是网关,Juniper防火墙,LVS DR mode 与 HTTP keepalive 丢包问题追查...
  17. 2016.8.6 学习总结
  18. strut2 上传文件
  19. python学习(列表,元祖)
  20. 视频教程-PHP基础项目实战/过程化开发-PHP

热门文章

  1. 开源OA哪个强,看我来说说
  2. Dice coefficient
  3. 74191五进制减法计数器1/2分频
  4. xgboost / lightgbm for NLP 添加一些 写死的/hardcode 的比如同义词 “特征”/规则
  5. 学习写一个模仿天猫网站
  6. 周洋父亲控告权健被天津公安不予立案:无犯罪事实
  7. DECODE函数和SIGN函数详解
  8. 项目开发流程(V模型)
  9. 屏幕像素与纹理像素(Pixel和Texe,像素和纹素l)
  10. 实现顺序栈各种基本运算的算法