提高去重计数效率——代理键+bitmap去重

本文介绍了在大数据场景下提高字符串去重计数效率的方法,通过代理键和RBM(位图)技术实现高效去重。首先,对比了简单的去重计数方法的优缺点,然后详细阐述了使用代理键(如row_number生成的数字类型)避免哈希碰撞,结合RBM进行去重的方案。最后,解释了代理键的概念及其在数据库设计中的作用,指出在特定情况下使用代理键能有效节省空间并避免数据冗余。
摘要由CSDN通过智能技术生成

背景

现实场景中经常会遇到字符串字段去重计数的场景,常见方式如下:

  • 最简单的是count(distinct),性能最差,不推荐
  • group by 后count(1),充分利用分布式并行计算的优点,但是容易遇到数据倾斜,总体上是推荐
    除了以上两种方式,还可以借助rbm进行去重计数,接下来介绍代理键+rbm的方法

方案介绍

rbm是bitset的优化,把long型变量分为高32位和低32位分别存放,高32位用作索引(具体原理可参考https://blog.csdn.net/u011624157/article/details/108432494)。
rbm是很好用,但是只能存放int、long等数字类型,要对字符串做去重的话需要把字符串映射成数值,方案有两种:

  • 取hashcode,实现较简单,但数据量太大会有hash碰撞,仅适用于中小规模数据量
  • 使用row_number函数生成数字类型代理键,实现略复杂,需要做一个中间表,但是去重精确,适用于大数据量场景

详细实现

接下来说代理键+rbm的详细代码

  • 1、先做代理键
select
    log_id,
    id
from(
select
    log_id,
    row_sequence() as id --使用row_sequence函数生成代理键
from(
select 
    log_id
from
(
    select log_id
    from base_log
) t1
group by log_id
) a) a
distribute by id
;

  • 2、根据rbm udaf进行去重

附:代理键名词解释

代理键

在关系型数据库设计中,代理键(英语:surrogate key)是在当资料表中的候选键都不适合当主键时,例如资料太长,或是意义层面太多,就会请一个无意义的但唯一的字段来代为作主键。

代理键是:

Surrogate (1) – Hall, Owlett and Codd (1976)
一个代理键值确定了外部世界的一个实体。代理键值是数据库生成的,从来不显示给用户或应用程序看。
Surrogate (2) – Wieringa and De Jonge (1991)
一个代理键值确定了数据库中的一个对象。代理键值是数据库生成的,用户或应用程序看不到它。
在实践中,代理键值通常是个自动递增的数字。在Sybase或SQL Server,用identity column标识代理键,PostgreSQL用serial,Oracle用SEQUENCE,在MySQL用标记有AUTO_INCREMENT的字段。

何时使用代理键

以中华人民共和国的十八位身份证号为例,从左往右为六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

一家公司想要将它的客户记入数据库,以客户的身份证号作为主键当然是可以的;但是这18位身份证号是用于标识大陆13多亿人口的,一家公司的客户显然没有这么多,所以用18位的数字作为主键有点浪费空间。

另外,身份证号中包含了地区、生日信息,若以身份证号为主键,要不要另开字段记录客户的地区、生日也是个问题。如果不另开字段,从主键(身份证号)中提取地区、生日有点麻烦;如果开字段,主键和地区、生日字段的数据存在冗余。

所以,一般的做法是,根本不记录客户的身份证号(除非有其他需求),用一个代理键作为主键,另开字段记录客户的地区、生日等信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左林右李02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值