在Spark中使用重新分区时没有哈希分区

时间:2018-11-21 15:40:17

标签: python apache-spark dataframe rdd hadoop-partitioning

火花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,它可以进一步用于优化?

0 个答案:

没有答案