在Spark中,从性能角度来看,在lookup
之后使用partitionBy
是否更好,而不是:
sc.parallelize(range(4000000)) \
.mapPartitions( lambda l: [ dict( [ (i,i) for i in l ] ) ] ) \
.map( lambda d: d.get(33, None) ) \
.collect()
我的目标是使用快速查找来模拟分布式散列图。
答案 0 :(得分:1)
是否使用partitionBy
然后使用lookup
或为每个分区创建一个HashMap
,其中存储所有发生的元素在很大程度上取决于您的数据。根据关键基数和数据分布,前者或后者的解决方案都是有利的。
但是,在一般情况下,我会经常避免使用lookup
,因为它是分区大小的线性操作。当您对分区数据调用lookup
时,它将完全遍历相应的分区以查找具有匹配键的所有元素。对于此操作,具有更好查找复杂性的数据结构可能是有益的。
如果你真的想要实现分布式哈希映射,那么我猜你应该对数据进行分区,在其上调用distinct,然后将剩余数据插入哈希映射中以便更快地进行查询。