我需要计算其中一列df1中有多少个值存在于df2的一列中。 (我只需要匹配值的数量)
如果效率不是一个大问题,我不会问这个问题:
df1 contains 100,000,000+ records
df2 contains 1,000,000,000+ records
答案 0 :(得分:0)
对于intersection
不会削减它的情况,我的主意只是一个偏见:
对于列中包含的数据类型,找到两个哈希函数h1
,h2
,以便
h1
大致均匀地产生0到N h2
大致均匀地产生0到M 使M * N
约为1B,例如M = 10k
,N = 100k
,
然后:
x
到df1
(h1(x), x)
映射
x
到df2
(h1(x), x)
映射
h1
分组到x
s h1
(这将是令人讨厌的洗牌)然后在本地,对于来自(b1, b2)
和df1
且具有相同df2
哈希码的每对存储桶h1
,执行基本相同的操作:
h2
来自b
和b1
的所有b2
,h2
toSet
并直接计算交叉点来比较剩余的小子子桶。交叉后剩下的所有内容都存在于df1
和df2
中,因此请计算size
并对所有分区中的结果求和。
我们的想法是选择N
足够小,以便带有M
条目的存储桶仍然可以轻松地放在单个节点上,但同时防止整个应用程序在第一次重复播放时死亡通过将每个密钥发送给其他人来找出它的位置。例如,使用SHA-256作为h1
的“哈希码”并没有多大帮助,因为密钥本质上是唯一的,因此您可以直接获取原始数据并尝试对其进行随机播放。但是,如果您将N
限制为一些相当小的数字,例如10k,你得到了一个粗略的近似值,然后你可以重新组合桶并用h2
开始第二阶段。
基本上它只是一个随机猜测,我没有测试它。很可能内置的intersection
比我想象的更聪明。