Spark:在大型DataSet中搜索匹配项

时间:2018-04-06 19:59:26

标签: scala apache-spark

我需要计算其中一列df1中有多少个值存在于df2的一列中。 (我只需要匹配值的数量)

如果效率不是一个大问题,我不会问这个问题:

df1 contains 100,000,000+ records

df2 contains 1,000,000,000+ records

1 个答案:

答案 0 :(得分:0)

对于intersection不会削减它的情况,我的主意只是一个偏见:

对于列中包含的数据类型,找到两个哈希函数h1h2,以便

  • h1大致均匀地产生0到N
  • 之间的哈希值
  • h2大致均匀地产生0到M
  • 之间的哈希值

使M * N约为1B,例如M = 10kN = 100k

然后:

  • xdf1
  • 列中的每个条目(h1(x), x)映射
  • xdf2
  • 列中的每个条目(h1(x), x)映射
  • h1分组到x s
  • 的分组中
  • 加入h1(这将是令人讨厌的洗牌)

然后在本地,对于来自(b1, b2)df1且具有相同df2哈希码的每对存储桶h1,执行基本相同的操作:

  • 计算h2来自bb1的所有b2
  • 按哈希码h2
  • 分组
  • 通过转换所有toSet并直接计算交叉点来比较剩余的小子子桶。

交叉后剩下的所有内容都存在于df1df2中,因此请计算size并对所有分区中的结果求和。

我们的想法是选择N足够小,以便带有M条目的存储桶仍然可以轻松地放在单个节点上,但同时防止整个应用程序在第一次重复播放时死亡通过将每个密钥发送给其他人来找出它的位置。例如,使用SHA-256作为h1的“哈希码”并没有多大帮助,因为密钥本质上是唯一的,因此您可以直接获取原始数据并尝试对其进行随机播放。但是,如果您将N限制为一些相当小的数字,例如10k,你得到了一个粗略的近似值,然后你可以重新组合桶并用h2开始第二阶段。

基本上它只是一个随机猜测,我没有测试它。很可能内置的intersection比我想象的更聪明。

相关问题