大数据记录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开始的序号。