进来闲来无事,总结一下数仓面试吧!希望对小白有点用!

有50W个某东网站店铺,每个顾客访客访问任何一个店铺的任何一个商品时都会产生一条访问日志,访问日志存储的表名为Visit,访客的用户id为user_id,被访问的店铺名称为shop,请统计:
1)每个店铺的UV(访客数)
2)每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数


1


首先,先明白什么是旁uv?
PV(Page View)访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量;在一定统计周期内用户每打开或刷新一个页面就记录1次,多次打开或刷新同一页面则浏览量累计。

即(独立的访客)Unique Visitor,访问您网站的一台电脑客户端为一个访客。在00:00-24:00内对相同的客户端的操作只会被计算一次。

建表语句

 create table second_visit (user_id string,shop string);

插入数据

insert into table second_visit values ('1','a');
insert into table second_visit values ('1','b');
insert into table second_visit values ('2','a');
insert into table second_visit values ('3','c');
insert into table second_visit values ('1','a');
insert into table second_visit values ('1','a');

首先,先去重(group by),首先按用户id去重,在按照门店去重。


select
    user_id,
    shop
from second_visit
group by user_id,shop;

结果为:
OK
user_id shop
1 a
1 b
2 a
3 c
Time taken: 23.059 seconds, Fetched: 4 row(s)


在计算uv的量


select
    tmp.shop,
    count(1) as uv
from
(
    select
	    user_id,
	    shop
    from second_visit
    group by user_id,shop
)tmp
group by shop;

结果为:
OK
tmp.shop uv
a 2
b 1
c 1
Time taken: 19.453 seconds, Fetched: 3 row(s)


2


数据太少。。。在插入点数据
insert into table second_visit values (‘4’,‘a’);
insert into table second_visit values (‘1’,‘b’);
insert into table second_visit values (‘2’,‘a’);
insert into table second_visit values (‘4’,‘c’);
insert into table second_visit values (‘4’,‘a’);
insert into table second_visit values (‘4’,‘a’);
insert into table second_visit values (‘5’,‘a’);
insert into table second_visit values (‘1’,‘b’);
insert into table second_visit values (‘2’,‘a’);
insert into table second_visit values (‘3’,‘c’);
insert into table second_visit values (‘5’,‘a’);
insert into table second_visit values (‘5’,‘a’);
insert into table second_visit values (‘5’,‘a’);
insert into table second_visit values (‘1’,‘b’);
insert into table second_visit values (‘4’,‘a’);
insert into table second_visit values (‘4’,‘c’);
insert into table second_visit values (‘2’,‘a’);
insert into table second_visit values (‘2’,‘a’);
insert into table second_visit values (‘4’,‘c’);
insert into table second_visit values (‘4’,‘c’);
insert into table second_visit values (‘3’,‘c’);
insert into table second_visit values (‘3’,‘c’);
insert into table second_visit values (‘5’,‘c’);
。。。。。。。
。。。。。。。


第一步也是首先进行去重并统计一个用户访问的次数。(先按店铺去重,在按用户id去重)


select
    user_id,
    shop,
	count(1) uvcount
from second_visit
group by shop,user_id;

结果为:

user_idshopuvcount
1a3
2a9
4a8
5a10
1b7
2b1
5b2
6b3
3c7
4c9
5c2
6c2

在利用开窗函数来进行排序 row_number() over()


select 
    tmp.user_id,
    tmp.shop,
    tmp.uvcount,
    row_number() over(partition by tmp.shop order by tmp.uvcount desc) rank
from
(
    select
	    user_id,
	    shop,
	    count(1) uvcount
    from second_visit
    group by shop,user_id
) tmp;

结果为:

tmp.user_idtmp.shoptmp.uvcountrank
5a101
2a92
4a83
1a34
1b71
6b32
5b23
2b14
4c91
3c72
5c23
6c24

终极hivesql


select
    tmp1.shop,
    tmp1.user_id,
    tmp1.uvcount
from
(
    select 
	    tmp.user_id,
	    tmp.shop,
	    tmp.uvcount,
	    row_number() over(partition by tmp.shop order by tmp.uvcount desc) rank
    from
    (
	    select
		    user_id,
		    shop,
		    count(1) uvcount
	    from second_visit
	    group by shop,user_id
    ) tmp
)tmp1
where tmp1.rank<=3;

结果为:

tmp1.shoptmp1.user_idtmp1.uvcount
a510
a29
a48
b17
b63
b52
c49
c37
c52

大牛路过留下点意见!万分感谢!

更多推荐