Apache spark 查找与使用DICT的mapPartitions的性能比较

Apache spark 查找与使用DICT的mapPartitions的性能比较,apache-spark,Apache Spark,在Spark中,从性能角度来看,在partitionBy之后使用lookup是否比使用以下内容更好: sc.parallelize(range(4000000)) \ .mapPartitions( lambda l: [ dict( [ (i,i) for i in l ] ) ] ) \ .map( lambda d: d.get(33, None) ) \ .c

在Spark中,从性能角度来看,在
partitionBy
之后使用
lookup
是否比使用以下内容更好:

sc.parallelize(range(4000000))                                 \
  .mapPartitions( lambda l: [ dict( [ (i,i) for i in l ] ) ] ) \
  .map( lambda d: d.get(33, None) )                            \
  .collect()

我的目标是模拟具有快速查找功能的分布式hashmap。

是使用
partitionBy
,然后使用
lookup
,还是为每个分区创建一个
hashmap
,它存储所有发生的元素,这在很大程度上取决于您的数据。根据密钥基数和数据分布,前者或后者都是有利的

但是,在一般情况下,我不会太频繁地使用
查找
,因为它是分区大小的线性操作。当您对分区数据调用
lookup
时,它将完全遍历相应的分区以查找具有匹配键的所有元素。对于此操作,具有更好查找复杂性的数据结构可能是有益的


如果您真的想实现分布式哈希映射,那么我想您应该对数据进行分区,对其调用distinct,然后将剩余数据插入哈希映射以实现更快的查询。

我的目标是模拟具有快速查找功能的分布式哈希映射。我编辑了我的问题以反映这一点。@FailingSkies,我认为这在很大程度上取决于您的数据,例如密钥基数和数据分布。此外,您必须正确地指定语义。在您的解决方案中,如果某个分区包含具有相同键的元素,您将无法获得与
查找
相同的结果。如果您真的想实现一个分布式哈希映射,那么我想您应该对数据进行分区,对其调用distinct,然后在哈希映射中插入剩余的数据,以便更快地查询。
lookup
的问题在于它是一个贯穿整个分区的线性操作。谢谢,这就是我要寻找的答案“lookup是[…]一个贯穿整个分区的线性操作”。请用它来制定一个正确的答案,这样我就可以给你学分了。我在这里没有看到分布式哈希图。您正在创建字典的RDD,然后尝试从字典中获取33元素…eliasah正确,我尝试模拟一个,而不是构建一个。RDD已经分发,并且有自己的哈希函数,那么您尝试模拟什么?你想做什么还不清楚,当然不是冒犯。