我有一个带30条记录的RDD(键/值对:键是时间戳,值是JPEG字节数组)
我正在运行30个遗嘱执行人。我想将此RDD重新分区为30个分区,以便每个分区获得一条记录并分配给一个执行程序。
当我使用rdd.repartition(30)
时,它会在30个分区中重新分区我的rdd,但是有些分区获得2条记录,有些分区获得1条记录,有些分区没有获得任何记录。
Spark中是否有任何方法可以将记录均匀地分发到所有分区。
答案 0 :(得分:1)
Salting 技术,该技术包括添加新的“假”密钥并与当前密钥一起使用,以更好地分配数据。
答案 1 :(得分:0)
您可以使用partitionBy
命令强制执行新分区并提供多个分区。默认情况下,分区程序是基于散列的,但您可以切换到基于范围的分区以获得更好的分发。如果你真的想强制重新分区,可以使用随机数生成器作为分区函数(在PySpark中)。
my_rdd.partitionBy(pCount, partitionFunc = lambda x: np.random.randint(pCount))
但是,这会经常导致效率低下(节点之间传输大量数据),但如果您的进程受计算限制,则可能有意义。