为什么Spark RDD partitionBy方法既有分区数又有分区函数?

Why Spark RDD partitionBy method has both number of partitions and partition function?

方法 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 部分没有任何数据。