统计分析及建表过程中通常会遇到这样的需求,比如:
1. 统计以逗号分隔的标签数,哪个最受欢迎,以及作为内容推荐的数据来源
2. 分组排序url的pv, 取topN的列表
3. 经常会有名字重复的url记录,取pv最大的那条, 剩下的剔除
下面逐一对以上场景进行总结, 用的是 hivesql,希望有同样需求的同学可以快速应用,如果有不对的地方还请指正:)
1. 统计以逗号分隔的标签数,哪个最受欢迎
hive表中tag列经常是这样的
--统计以逗号分隔的tags的分布
--其中tags是你打算展开的原先以逗号分隔的那一列,
--tags_split 是展成多行后的每个tag组成的列,
--alias是别名,可以自己任意定
--然后group by, 统计个数分布
select tags_split,count(*) as n from
(
select tags_split
from table1
LATERAL VIEW explode(split(tags,",")) alias AS tags_split
where date = '20141119'
)a
group by tags_split
order by n desc;
2. 分组排序url的pv, 取topN的列表
--首先统计下pv大于100的url及对应的pv
select url, url_name, host, count(*) as pv
from table1 a
where date = '20141119'
group by url, url_name, host
having count(*) > 100
--如果还想按同一域名下url取pv倒序后的top20,可以这样写
select *
from
(
select *,
ROW_NUMBER ( ) OVER (partition by host order by pv desc) as host_pv_rank
from
(
select url, url_name, host, count(*) as pv
from table1 a
where date = '20141119'
group by url, url_name, host
having count(*) > 100
)a
)a
where host_pv_rank <= 20
order by host_pv_rank;
3. 经常会有名字重复的url记录,要取pv最大的那条, 剩下的剔除
方法1:在没有row_number函数的情况下:
select
source.*,
case when dup.pv_max is null then 0 else 1 end as no_dup_flag
--如果找不到即为重复的,只有最大的那个是1
from
(
select url, url_name, count(*) as pv
from table1 a
where date = '20141119'
group by url ,url_name
having count(*) > 100
)source
left outer join
(
select url_name, max(pv) as pv_max from
(
select url, url_name, count(*) as pv
from table1 a
where date = '20141119'
group by url, url_name
having count(*) > 100
)a
group by url_name
)dup
on source.url_name = dup.url_name
and source.pv = dup.pv_max
--与最大的那条记录通过 url_name
--与最大那条的pv进行关联,只有url_name与pv同时相等才能关联得上
--否则就是重名的但pv小的记录,我们这里将重复的记录标记出来
方法2:在有row_number函数的情况下:
select
source.*,
ROW_NUMBER ( ) OVER (partition by url_name order by pv desc) as dup_flag
-- dup_flag > 1 即为重复的
from
(
select url, url_name, count(*) as pv
from table1 a
where date = '20141119'
group by url ,url_name
having count(*) > 100
)source
经测试,方法2要快很多(因为没有了求max 和 join的操作)
sql作为流行的查询语言,不管是hive, 还是spark, 都对sql有很好的支持,
与此同时,像item based推荐等复杂一些的模型算法,也可以通过sql的方式很方便地解决,
楼主感觉掌握好sql,对日常的统计分析工作,快速验证数据准确性,快速展现设计结果,甚至对产品优化改进都很有帮助,
所以大家一起努力学习吧:)