以此示例代码为例。
在这里,我生成一个数据帧,其中50个唯一条目重复8次。
for i in range(49):
uno = random.random()
due = random.random()
l = [(uno, due)]
dfu = dfu.union(spark.createDataFrame(l, ['uno', 'due']))
for i in range(3):
dfu = dfu.union(dfu)
print('Elements:', dfu.count())
元素:400
然后,我检查了我的数据帧的rdd。首先,2400个分区没有任何意义,因为2000个分区是空的,但这不是我要解决的问题。
# ORIGINAL
print("Original partitions:", dfu.rdd.getNumPartitions())
pprint(dfu.rdd.glom().collect())
原始分区:2400
我按列指定我需要400个分区。我期望的是400个分区,每个分区包含相同的字段值" uno"我分区了。由于我只有50个字段" uno"的唯一值,我预计有50个非空分区和350个空分区。
# REPARTITIONS
df1 = dfu.repartition(400, "uno").sortWithinPartitions("due")
print("Repartitions:", df1.rdd.getNumPartitions())
pprint(df1.rdd.glom().collect())
重新分配:400
我得到的确实是400个分区,但其中一些分区包含多个唯一值;换句话说,我得到的空分区少于50个。
这很令人沮丧,首先是因为它是API中没有描述的意外行为,但主要是因为我可能想运行df1.mapPartitions()
并编写一些代码,假设每个分区只包含唯一元素。观察,我选择的分区比实际需要的多(即50)。
为什么Spark表现得这样?我错过了什么吗?
为了清楚起见,这里是我输出的一部分的快照; " uno"的不同值应该属于不同的分区。
[],
[ Row(uno=0.06541487834242865, due=0.8924866228784675),
Row(uno=0.06541487834242865, due=0.8924866228784675),
Row(uno=0.06541487834242865, due=0.8924866228784675),
Row(uno=0.06541487834242865, due=0.8924866228784675),
Row(uno=0.06541487834242865, due=0.8924866228784675),
Row(uno=0.06541487834242865, due=0.8924866228784675),
Row(uno=0.06541487834242865, due=0.8924866228784675),
Row(uno=0.06541487834242865, due=0.8924866228784675),
Row(uno=0.9409267037450175, due=0.901923815270492),
Row(uno=0.9409267037450175, due=0.901923815270492),
Row(uno=0.9409267037450175, due=0.901923815270492),
Row(uno=0.9409267037450175, due=0.901923815270492),
Row(uno=0.9409267037450175, due=0.901923815270492),
Row(uno=0.9409267037450175, due=0.901923815270492),
Row(uno=0.9409267037450175, due=0.901923815270492),
Row(uno=0.9409267037450175, due=0.901923815270492)],
[],