为什么Spark RDD的partitionBy方法既有分区数又有分区功能?



方法partitionBy签名为RDD.partitionBy(numPartitions, partitionFunc=<function portable_hash>)。为什么有两个参数?例如,如果我有以下代码:

rdd.partitionBy(4, partitionFunc=lambda _key: randint())

将创建多少分区?4作为第一个参数?或者与partitionFunc中生成的随机密钥一样多的分区?如果第一个参数是正确的,那么第二个参数的意义是什么?Spark文档对整个RDD API站点的任何参数都不清楚…

基本上,第一个参数是您将数据划分为多少分区,第二个参数是数据应该划分到哪里。

这是一个简短的演示。

df = spark.createDataframe([
[1, "aaaaaa"],
[2, "bbbbbb"],
[2, "cccccc"],
[3, "dddddd"]
], ['num', 'text'])
# partitionBy requires pairwise RDD, so convert the dataframe to pairwise RDD.
pair = df.rdd.map(lambda x: (x[0], x[1:]))

情形1:按5划分,没有明确的部件配置。它将尝试将数据分成5部分,但如果数据较少,则会有一些没有数据的分区。

pair.partitionBy(5).glom().collect()
[[],
[(1, "aaaaaa",)],
[(2, "bbbbbb",), (2, "cccccc",)],
[(3, "dddddd",)]
[]]

在此例中,分区0和4没有数据,分区1-3有一些数据。

情况2:按5分区并强制它们进入1的分区。

pair.partitionBy(5, lambda _: 1).glom().collect()
[[],
[(1, "aaaaaa",), (2, "bbbbbb",), (2, "cccccc",), (3, "dddddd",)],
[],
[],
[]]

这次所有的数据都放到分区1中,0、2、3、4部分没有数据。

相关内容

  • 没有找到相关文章

最新更新