长周期指标的计算优化方案

1 背景

在电子商务公司(如淘宝),对用户的数据分析的角度和思路可谓是应有尽有、层出不穷。所以在电商数据仓库和商业分析场景里,经常需要计算最近N天访客数、最近N天的购买用户数、老客数等等类似的指标。这些指标有一个共同点:都需要根据用户在电商平台上(或网上店铺)一段时间积累的数据进行计算(这里讨论的前提是数据都存储在MaxCompute上)。
一般情况下,这些指标的计算方式就是从日志明细表中计算就行了,如下代码计算商品的最近30天访客数:

select   item_id         --商品id
     ,count(distinct visitor_id) as ipv_uv_1d_001
from     用户访问商品日志明细表
where    ds <= ${bdp.system.bizdate}
and ds >=to_char(dateadd(to_date(${bdp.system.bizdate},'yyyymmdd'),-29,'dd'),'yyyymmdd')
 group by item_id

  但是当每天的日志量很大时,上面代码存在一个严重的问题,需要的Map Instance个数太多,甚至会超过99999个Instance个数的限制,Map Task就没有办法顺利执行,更别说后续的操作了。为什么Instance个数需要那么多呢?原因:每天的日志数据很大,30天的数据量更是惊人。这时候Select 操作需要大量的Map Instance,结果查过了Instance的上限,代码无法运行

2 目的

  如何计算长周期的指标,又不影响性能?

  1. 多天汇总的问题根源是数据量的问题,如果把数据量给降低了,就可以解决这个问题了。

  2. 减少数据量最直接的办法是把每天的数据量都给减少,因此需要构建临时表,对1d的数据进行轻度汇总,这样就能去掉很多重复数据,减少数据量。

3 方案

  1. 构建中间表,每天汇总一次,比如对于上面的例子,构建一个item_id+visitor_id粒度的中间表

  2. 计算多天的数据,依赖中间表进行汇总

  例子如下:

   step1:构建item_id+visitior_id粒度的日汇总表,记作A

insert overwrite table mds_itm_vsr_xx(ds='${bdp.system.bizdate} ')
select item_id,visitor_id,count(1) as pv
from
    (
     select   item_id,visitor_id
     from     用户访问商品日志明细表
     where    ds =${bdp.system.bizdate}
     group by item_id,visitor_id
    )a

  setp2:对A进行30天汇总

   select   item_id
            ,count(distinct visitor_id) as uv
            ,sum(pv) as pv
     from      mds_itm_vsr_xx
     where    ds <= '${bdp.system.bizdate} '
     and      ds >= to_char(dateadd(to_date('${bdp.system.bizdate} ','yyyymmdd'),-29,'dd'),'yyyymmdd')
     group by item_id

4 影响及思考

  上面讲述的方法,对每天的访问日志明细数据进行单天去重,从而减少了数据量,提高了性能。缺点是每次计算多天的数据的时候,都要N个分区的数据,那么能不能有一种方式,不需要读取N个分区的数据,而是把N个分区的数据压缩合并成一个分区的数据,让一个分区的数据包含历史数据的信息。业务上是有类似场景的,有如下方式:

1. 增量累计方式计算长周期指标

  例子:求最近1天店铺商品的老买家数,老买家数的算法定义为:过去一段时间有购买的买家(比如过去30天)。
一般情况下,老买家数计算方式:

select   item_id         --商品id
       ,buyer_id as old_buyer_id
from     用户购买商品明细表
where    ds < ${bdp.system.bizdate}
and ds >=to_char(dateadd(to_date(${bdp.system.bizdate},'yyyymmdd'),-29,'dd'),'yyyymmdd')
 group by item_id
        ,buyer_id

  改进思路:
   1. 维护一张店铺商品和买家购买关系的维表记作表A,记录买家和店铺的购买关系,以及第一次购买时间,最近一次购买时间,累计购买件数,累计购买金额等等信息
   2. 每天使用最近1天的支付明细日志更新表A的相关数据
   3. 计算老买家时,最需要判断最近一次购买时间是否是30天之内就行了,从而做到最大程度上的数据关系对去重,减少了计算输入数据量

时间: 2024-10-01 16:17:00

长周期指标的计算优化方案的相关文章

sql计算‘去年同期’的问题,求一优化方案,谢谢。

问题描述 sql计算'去年同期'的问题,求一优化方案,谢谢. SELECT a.period, a.type, a.commodity, a.export, a. CODE, a.unit, a.number, -- 当月量 a.total_number, -- 累积量 a.amount, -- 当月金额 a.total_amount, -- 累计金额 ( SELECT number FROM c_now_data b WHERE CAST(b.period AS CHAR(50)) = CAS

大型网站压力测试及优化方案

木桶理论应用在系统优化中   木桶理论又称短板理论,其核心思想是一只木桶盛水多少,并不取决于最高的木板,而取决于最短的那块木板. 木桶原理应用在系统分析中,即系统的最终性能取决于系统中性能表现最差的组件,为了提升系统整体性能,对系统中表现最差的组件进行优化可以得到最好的效果.     在网站系统中,用户的访问请求到达服务器,然后服务器返回数据并展示给用户,这个过程要经过很多处理,每一个过程的低效都会影响系统整体表现出来的性能.   按照木桶理论,如果一台服务器性能非常强大,拥有充足的内存资源和C

人才网站优化方案之收录和关键词分析

人才网站优化已经成为网络营销经营策略的必然要求.如果在人才网站建设中没有体现网站优化和搜索引擎优化的基本思想,在网络营销水平普遍提高的网络营销环境中是很难获得竞争优势的. 人才网站优化可以从狭义和广义两个方面来说明,狭义的人才网站优化,即搜索引擎优化,也就是让人才网站设计适合搜索引擎检索,满足搜索引擎排名的指标,从而在搜索引擎检索中获得排名靠前,增强搜索引擎营销的效果.广义的人才网站优化所考虑的因素不仅仅是搜索引擎,也包括充分满足用户的需求特征.清晰的网站导航.完善的在线帮助等,在此基础上使得网

个人经验总结seo优化方案的七个关键点

一:网站的定位 网站的定位主要指我们要根据我们做的行业来做好前期的规划,例如:我们是应该选择怎样竞争度的关键词?选择的盈利模式是怎样的? 关键词的挖掘 指我们在网站建设前期挖掘大量的关键词,然后进行针对性的筛选,从筛选中的来确定好早期的目标关键词和长尾关键词,我们在选择目标关键词和长尾关键词的时候一定要考虑两个重要因素. (1).关键词的转化率 (2).关键词的流量我们要选择的关键词一定是要这两个因素都能够达到综合要求才行. 我们根据这2个要求来选择我们的要做的目标关键词和长尾关键词. 盈利模式

地图点聚合优化方案

一.为什么需要点聚合       在地图上查询结果通常以标记点的形式展现,但是如果标记点较多,不仅会大大增加客户端的渲染时间,让客户端变得很卡,而且会让人产生密集恐惧症(图1).为了解决这一问题,我们需要一种手段能在用户有限的可视区域范围内,利用最小的区域展示出最全面的信息,而又不产生重叠覆盖. 图1 二.已尝试的方案---kmeans          直觉上用聚类算法能较好达成我们目标,因此采用简单的kmeans聚类.根据客户端的请求,我们知道了客户端显示的范围,并到索引引擎里取出在此范围内

Mysql性能优化方案分享_Mysql

网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化. mysql> show global status; 可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:mysql> show variables; 一.慢查询 m

mysql 性能优化方案

网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与负责,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化,网上找了一篇文章,分页分得乱七八糟的,只能转到博客. mysql> show global status; 可以列出mysql服务器运行各种状态值,另外,查询mysql服务器配置信息语句: m

地理空间距离计算优化

http://tech.meituan.com/lucene-distance.html 1 地理空间距离计算面临的挑战 打开美团app,不管是筛选团购还是筛选商家,默认的排序项都是"离我最近"或者"智能排序"(如下图所示). 不管是"离我最近"还是"智能排序",都涉及到计算用户位置与各个团购单子或者商家的距离(注:在智能排序中距离作为一个重要的参数参与排序打分).以筛选商家为例,北京地区有5~6w个POI(本文将商家称之为P

阿里巴巴店铺排名优化方案分享

最近一个朋友想做阿里巴巴店铺排名优化这块,根据自己的优化分析经验,就给朋友做了一个大概的优化方案文档.今天小编想通过站长平台和各位站长同行们分享一下,方便与大家能够共同的探讨研究. 以下是优化方案文档完整内容: 其实,不论独立网站优化.阿里店铺优化.还是淘宝优化.抑或是软件结构优化,最终就是围绕"用户体验".咱们这个是在阿里巴巴中国站开设的阿里店铺.阿里店铺排名优化大多是在细节上,也可以说就是在产品本身上做优化.因为对于店铺程序代码上咱们肯定是变动不了的.那么就可以从两点来做改善:一是