原创|Spark千亿级数据去重,性能优化踩坑之路

好久没有更新原创了

大家好,我是狗哥,今天给大家写一点干货,这次咱们就从0-1把思路给大家讲一下,这也是我同事在数据开发中踩过的坑,希望能帮助到大家。

51f3ce90ba08e30caf68d2e3b1ade221.png

先虚拟一个业务场景,方便大家思考

我举个例子,拿京东或者淘宝说吧,如果你的业务让你计算几个维度(广告位置、小时、广告类型等等吧,我就随便举个例子),每个维度的数据uv量级,方便业务评估和市场决策,数据精准度不要求完全精准,误差在1%以内就行了,你该如何做?

我们针对两个开发者思路,来跟大家梳理我们踩过的坑。

思路一,能跑就行,不关注性能

解决方式:直接count distinct

优势:应届生都会

弊端:数据去重性能差

计算性能:刚开始数据量少,4-6个小时可以出来,随着数据量增多运行时间 6-12个小时,业务对此非常不满意,早上来了看不到数据报表,需要等下午才产出,直接影响数据人员的口碑(老板开周会,肯定会diss做数据的,不能忍呀兄弟们,一定要精益求精!!!)。

思路二,用bitmap去重复

经过一番技术调研,发现用bitmap去重复,性能会很高,但设备id(imei、idfa) 不是数字,没有办法用bitmap,如果想用bitmap,需要把设备ID做hash计算,还得取绝对值,正数才行

解决方式:abs(hash(imei))

优势:bitmap去重复性能高效,数据计算性能降低到了40分钟,从之前的10个小时跑不出来,变成了40分钟可以运行出来,直接单车变摩托。

弊端:发现数据误差到了6%,排查发现,是数据设备ID在hash的时候会出现正负数,也就是两个设备他的hash值是正负对称的(举个例子:一个设备hash值 -1,一设备个hash值1),两个设备取绝对值abs,会出现都等于1。

针对这个问题,狗哥给出了建议,就是先根据设备ID取模1000(这个数大家可以自己去根据数据量调试),进行设备ID分桶,这样的好处相同设备会分在同一个桶内,同时减少了hash值绝对值这之后相互影响的情况,然后每个分桶的u去重复uv再累加,这样下来,分维度的数据uv就会计算出来了,数据准确度到了0.03%,符合业务要求,同时数据性能稳定在40分钟左右。

先给狗哥点个赞,如果你支持狗哥,记得帮狗哥转发一下,后边狗哥干货多多。88eb1b89cc537801ff84962d6b26aee3.pngf14535f1a789d4d6933ef101cc40e485.png

推荐阅读:Doris bitmap实现留存计算

6854b4259a6e86f1eb04913026d7c542.png

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值