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