大数据记录2

分组求最新视图

目前业界主流的求最新视图的方法有两种:

求最大值自连接
--假设现在有表T:user_id,update_time
--分组求最大值自连接
select 
user_id,
max(update_time) as max_time 
from t
group by user_id
join t t2
on t.user_id = t2.user_id and t.max_time = t2.max_time
排名函数取第一
--主流排名函数取第一(注意hql和spark sql的写法可以不一样,下面是hql的写法)
select * from 
(
    select 
    user_id,
    update_time,
    row_number() over(
        partition by user_id
        order by update_time DESC
    ) as rank
    from t
) t2
where rank = 1

前者的优点是能最大程度的进行分区内的局部聚合,缺点是可能产生两个job,且自连接需要再次扫描一次全表。

后者则是主流的做法,不仅可以取最新视图,也可以取TopN,缺点是需要开窗以及排序。

row_number() over(
        partition by user_id
        order by update_time DESC
    ) 

根据user_id分组可能会有多个组,每个组内根据update_time进行排序。每组内都会自动生成序号,从1开始,每组有多少数据就生成到几的序号。有多少分组就有多少个从1开始的序号。

 

posted @ 2020-01-08 14:26  ~清风煮酒~  阅读(150)  评论(0编辑  收藏  举报