小编Sha*_*gfu的帖子

Scala中的Spark:如何避免在每个分区中搜索密钥的线性扫描?

我有一个名为A的巨大键值数据集,以及一组名为B的键作为查询.我的任务是,对于B中的每个键,返回A中存在的键或不存在,如果存在,则返回该值.

我首先通过HashParitioner(100)对A进行分区.目前我可以使用A.join(B')来解决它,其中B'= B.map(x =>(x,null)).或者我们可以对B.中的每个键使用A.lookup().

但是,问题是PairRDD的连接和查找都是每个分区的线性扫描.这太慢了.根据我的意愿,每个分区都可以是一个Hashmap,这样我们就可以在O(1)中找到每个分区中的密钥.因此理想的策略是当主机接收到一堆密钥时,主机将每个密钥分配给其对应的分区,然后分区使用其Hashmap查找密钥并将结果返回给主机.

有没有一种简单的方法来实现它?

一种可能的方式:当我在网上搜索时,类似的问题在这里

http://mail-archives.us.apache.org/mod_mbox/spark-user/201401.mbox/%3CCAMwrk0kPiHoX6mAiwZTfkGRPxKURHhn9iqvFHfa4aGj3XJUCNg@mail.gmail.com%3E

如上所述,我使用以下代码为每个分区构建了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实现连接或查找方法的最简单方法是什么?

谢谢大家.

scala hashmap apache-spark

3
推荐指数
1
解决办法
467
查看次数

标签 统计

apache-spark ×1

hashmap ×1

scala ×1