记录分享一些大数据业务场景
问题一
数据集A:大小8位数,千万量级,含品牌名字段 A.a
数据集B:大小9位数,过亿量级,含店铺名字段 B.b
现在需要将数据集A与数据集B进行关联,即非等值连接,连接条件为: A.a in B.b
难点:
在小量级数据时,我们可以直接 A outerjoin B,再做filter。但此时如果此时这样做就会出现一个 8 + 9 = 17 位数量级的rdd,这显然做不到,集群节点都得爆炸。
解决:
将数据集A通过品牌名长度不同分离为多个rdd(显然不会超过10个,甚至不会超过5个)。将数据集B结合业务场景进行一些限制,如只保留在营店铺,过滤掉一些可以直接判定非期望结果的店铺数据,然后通过企业名截取过滤掉 ^.{2,4}[省市区] 前缀,后进行下标与长度的滑动切片,创造出 4 * 5 = 20 个左右 key 不同的 rdd,交替进行等值连接。
问题二
数据集A:5000个标的物设备词 A.a
数据集B:大小9位数,过亿量级,含招中标正文 B.b (该字段存储数据长度一般在几百)
现在要找出命中A.a的招中标正文B.b
难点:
过亿招标正文 * 5000词,每个 A.a in 一遍 B.b,这得跑多久
解决:
结合业务场景将 5000 词根据词后缀进行分组(桶),如 **机、**器,5000个词分完组后只余下100组,每组词数量 1~20 个左右不等。用100组词的key in 每篇公告,命中后再判断该组词下具体哪个词能命中公告。此时代码执行的时间复杂度就被大大优化了。