【发布时间】:2016-02-23 05:29:29
【问题描述】:
我现在正在研究这两个概念,并希望了解一下。通过命令行工作,我一直在尝试找出差异以及开发人员何时会使用 repartition 与 partitionBy。
这里是一些示例代码:
rdd = sc.parallelize([('a', 1), ('a', 2), ('b', 1), ('b', 3), ('c',1), ('ef',5)])
rdd1 = rdd.repartition(4)
rdd2 = rdd.partitionBy(4)
rdd1.glom().collect()
[[('b', 1), ('ef', 5)], [], [], [('a', 1), ('a', 2), ('b', 3), ('c', 1)]]
rdd2.glom().collect()
[[('a', 1), ('a', 2)], [], [('c', 1)], [('b', 1), ('b', 3), ('ef', 5)]]
我查看了两者的实现,我注意到的唯一区别是partitionBy 可以采用分区函数,或者默认使用portable_hash。所以在 partitionBy 中,所有相同的键都应该在同一个分区中。在重新分区中,我希望这些值在分区上分布得更均匀,但事实并非如此。
鉴于此,为什么有人会使用重新分区?我想我唯一能看到它被使用的情况是我没有使用 PairRDD,或者我有很大的数据偏差?
我有什么遗漏的吗,或者有人可以从不同的角度为我提供启示吗?
【问题讨论】:
标签: apache-spark pyspark rdd