我有一个名为A的巨大键值数据集,以及一组名为B的键作为查询.我的任务是,对于B中的每个键,返回A中存在的键或不存在,如果存在,则返回该值.
我首先通过HashParitioner(100)对A进行分区.目前我可以使用A.join(B')来解决它,其中B'= B.map(x =>(x,null)).或者我们可以对B.中的每个键使用A.lookup().
但是,问题是PairRDD的连接和查找都是每个分区的线性扫描.这太慢了.根据我的意愿,每个分区都可以是一个Hashmap,这样我们就可以在O(1)中找到每个分区中的密钥.因此理想的策略是当主机接收到一堆密钥时,主机将每个密钥分配给其对应的分区,然后分区使用其Hashmap查找密钥并将结果返回给主机.
有没有一种简单的方法来实现它?
一种可能的方式:当我在网上搜索时,类似的问题在这里
如上所述,我使用以下代码为每个分区构建了Hashmap
val hashpair = A.mapPartitions(iterator => {
val hashmap = new HashMap[Long, Double]
iterator.foreach { case (key, value) => hashmap.getOrElseUpdate(key,value) }
Iterator(hashmap)
})
Run Code Online (Sandbox Code Playgroud)
现在我得到100个Hashmap(如果我有100个数据A分区).在这里,我迷失了.我不知道如何询问查询,如何使用hashpair来搜索B中的键,因为hashpair不是常规RDD.我是否需要实现新的RDD并为hashpair实现RDD方法?如果是这样,为hashpair实现连接或查找方法的最简单方法是什么?
谢谢大家.