高效大数据开发之 bitmap 思想的运用
作者头像
  • it老记冀勇庆官方
  • 2020-10-03 09:43:52 0

数据统计分类与优化方案

数据仓库中的数据统计可以分为三大类:增量类、累计类和留存类。累计类进一步细分为历史至今的累计与最近一段时间内的累计(如滚动月活跃天、滚动周活跃天以及最近N天的消费情况)。为了实现高效的统计,可以采用基于bitmap思想的模型表。

一、背景

数据仓库中的数据统计可以分为三类:增量类、累计类和留存类。累计类可以进一步细分为历史至今的累计与最近一段时间内的累计,如滚动月活跃天、滚动周活跃天及最近N天的消费情况。借助bitmap思想的模型表能够高效地统计最近一段时间内的累计类和留存类数据。

二、业务场景

以下是几个最近一段时间内累计类和留存类的具体业务问题。作为大数据从业者,建议您先思考自己的解决方案,然后再继续阅读:

  1. 统计最近30天用户的累计活跃天数(用户在这30天中有N天使用微视应用,N介于1到30之间,然后将月活跃用户的N天相加)。

  2. 统计最近7天的用户累计使用时长。

  3. 统计最近30天有播放行为的用户总数。

  4. 统计最近30天活跃用户中有多少在连续3天及以上的时间内活跃。

  5. 统计28天前活跃用户的1天、3天、7天、14天和28天的留存率。

三、传统处理方案

在讨论本文的主题之前,让我们先看看传统处理思路:

  1. 统计最近30天用户的累计活跃天数?

    • 使用唯一的用户ID表,选取最近30天的数据分区,然后对活跃日期进行汇总。
  2. 统计最近7天的用户累计使用时长?

    • 使用唯一的用户ID表,选取最近7天的数据分区,然后对使用时长进行汇总。
  3. 统计最近30天有播放行为的用户总数?

    • 使用唯一的用户播放表,选取最近30天的数据分区,统计播放次数大于0的唯一用户数。
  4. 统计最近30天活跃用户中有多少在连续3天及以上的时间内活跃?

    • 使用唯一的用户ID表,选取最近30天的数据分区,通过多次连接同一分区的数据,检查用户是否在连续3天内活跃。
  5. 统计28天前活跃用户的1天、3天、7天、14天和28天的留存率?

    • 使用唯一的用户ID表,选取统计日期的活跃用户,左连接1天、3天、7天、14天和28天后的活跃用户,如果能够匹配则表明有留存。

四、传统处理方案存在的问题

  1. 重复计算:每天需要大量中间数据的重复计算。
  2. 逻辑复杂:复杂的统计逻辑,尤其是对于连续活跃天数的统计。
  3. 资源消耗大:频繁的join操作会消耗大量的集群资源。
  4. 扩展性差:难以适应不断变化的需求。

五、Bitmap原理

有没有一种方法可以在一个模型表中轻松统计这些数据,而不需要重复计算或复杂的join操作?答案是肯定的,可以借鉴bitmap的思想。

六、具体实施过程

借鉴bitmap思想,可以将最近31天的活跃用户状态和消费数据存储在一个字符数组中,数组的每个位置表示距离当前日期的天数。例如,active_date_set表示31天活跃集,play_vv_begin_set表示31天播放次数集。通过这种方式,可以极大地压缩存储空间,并简化统计过程。

七、具体应用实例

在Hive中使用这些0/1集合串需要一些辅助函数,例如str_sum()、str_count()、str_min()和str_max()。这些函数分别用于计算最近N天的加总、最小值、最大值和特定值的出现次数。

八、总结

通过使用基于bitmap思想的模型表,我们可以高效地统计最近一段时间内的累计数据和留存率,而无需进行复杂的join操作。虽然这种方法会增加一定的存储空间,但可以显著提升计算效率和灵活性。

    本文来源:图灵汇
责任编辑: : it老记冀勇庆官方
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
运用高效思想数据bitmap开发
    下一篇