Искра 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
, который в дальнейшем можно будет использовать для оптимизации?
RDD
неDataFrame
иDataFrame
секционирование (df._jdf.queryExecution().toRdd().partitioner()
) не может использоваться для логической оптимизации выполнения наRDD
, так же, какRDD
секционирование не влияет на логическую оптимизацию плана SQL, когдаRDD
преобразуется вDataFrame
. ДляDataFrame
операций ваше хорошее, как есть. - person zero323   schedule 21.11.2018