火花doc表示.repartition()
返回一个新的DataFrame,默认情况下为Hash-Partitioned
。但是,在我正在运行的示例中,情况并非如此。
rdd=sc.parallelize([('a',22),('b',1),('c',4),('b',1),('d',2),
('a',0),('d',3),('a',1),('c',4),('b',7),
('a',2),('a',22),('b',1),('c',4),('b',1),
('d',2),('a',0),('d',3),('a',1),('c',4),
('b',7),('a',2)]
)
df=rdd.toDF(['key','value'])
df=df.repartition(5,'key') #5 partitions on 'key' column
print("Partitioner: {}".format(df.rdd.partitioner)) # prints - 'Partitioner: None' Why??
为什么我没有分区器?让我使用glom()
函数-
print("Partitions structure: {}".format(df.rdd.glom().collect()))
[
[ #Partition 1
Row(key='a', value=22), Row(key='a', value=0), Row(key='a', value=1),
Row(key='a', value=2), Row(key='a', value=22), Row(key='a', value=0),
Row(key='a', value=1), Row(key='a', value=2)
],
[ #Partition 2
Row(key='b', value=1), Row(key='b', value=1), Row(key='b', value=7),
Row(key='b', value=1), Row(key='b', value=1), Row(key='b', value=7)
],
[ #Partition 3
Row(key='c', value=4), Row(key='c', value=4), Row(key='c', value=4),
Row(key='c', value=4)
],
[ #Partition 4 (empty)
],
[ #Partition 5
Row(key='d', value=2), Row(key='d', value=3), Row(key='d', value=2),
Row(key='d', value=3)
]
]
我们可以清楚地看到,数据按key
进行了很好的分区,所有Rows()
的同一key
列都在一个分区上结束。那么,为什么partitioner
打印None
?
我该怎么做才能拥有partitioner
,它可以进一步用于优化?