日期处理
获取当前日期:current_date
获取当前时间戳:current_timestamp
date_format数如果第一个参数是字符串,连接符只能是-,别的识别不了包括month(),year()等也识别不了必须要先用egexp_replace()换成-
窗口函数
- 函数含有
over()子句
聚合窗口函数:sum+窗口函数
所谓的聚合窗口函数指的是sum、max、min、avg这样的聚合函数在窗口函数中使用
排序窗口函数:rank()+窗口函数
例题
分析:窗口函数不会改变行数,所以先用聚合函数,再用窗口函数
t1:用户+时间分组
select userid,dateformat(regexp_replace(visitDate,'/','-'),'yyyy-MM') mn,
sum(visitCount) sum_visit by userId,mn;
t2:根据用户分组,按照时间累积求和
select userId,mn,sum_visit,
sum(sum_visit) over(partition by userId order by mn) sum_visit_time
from t1;
- 求UV时要去重,在面试和在工作中尽量不要使用
distinct去重 distinct去重,是把表中的一列数据放在一起去重,在hive中,会导致reduce数据量过大- 使用
group by代替distinct去重,group by将相同的userId放到一个reduce中,减少reduce数据量 - 使用
group by去重至少需要两步计算每个店铺的每个用户的访问次数
select shop,userId,count(*) from visit group by shop,userId t1
select shop,userId,ct row_number() over(partition by shop order by ct desc) rk from t1 t2
select shop,userId,ct from t2 where rk <= 3 t3