PySpark重新分区无法对列进行分组

时间:2017-12-19 16:04:04

标签: apache-spark pyspark partitioning

以此示例代码为例。

在这里,我生成一个数据帧,其中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)],
  [],

0 个答案:

没有答案