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

     

  • 相关阅读:
    java中讲讲PrintStream的用法,举例?
    Spark Scala当中reduceByKey的用法
    springboot与ActiveMQ整合
    solr(六): 集群
    zookeeper集群
    solr(五): centos中, 整合 tomcat&solr
    springboot redis(单机/集群)
    redis 五种数据类型
    redis 集群搭建: redis-cluster
    redis 持久化
  • 原文地址:https://www.cnblogs.com/shaozhiqi/p/12166423.html
Copyright © 2020-2023  润新知