2015-11-14 2 views
0

Я хочу сортировать свои К, V кортежей по V, т. Е. По значению. Я знаю, что TakeOrdered хорош для этого, если вы знаете, сколько вам нужно:Как эффективно сортировать по значению в PySpark?

b = sc.parallelize([('t',3),('b',4),('c',1)]) 

Использование TakeOrdered:

b.takeOrdered(3,lambda atuple: atuple[1]) 

Использование Lambda

b.map(lambda aTuple: (aTuple[1], aTuple[0])).sortByKey().map(
    lambda aTuple: (aTuple[0], aTuple[1])).collect() 

Я проверил вопрос here, что говорит о последнем. Мне трудно поверить, что takeOrdered так лаконичен, но для этого требуется такое же количество операций, как и решение Lambda.

Кто-нибудь знает о более простой, более сжатой трансформации в искры для сортировки по значению?

ответ

3

sortBy() Я думаю, что это более краткий:

b = sc.parallelize([('t', 3),('b', 4),('c', 1)]) 
bSorted = b.sortBy(lambda a: a[1]) 
bSorted.collect() 
... 
[('c', 1),('t', 3),('b', 4)] 

Это на самом деле not more efficient at all, как она включает в себя манипуляцию значений, сортировка с помощью клавиш, а затем захватывая ценности, но она выглядит красивее, чем ваше последнее решение. Что касается эффективности, я не думаю, что вы найдете более эффективное решение, так как вам понадобится способ преобразования данных таким образом, чтобы значения были вашими ключами (а затем, в конечном итоге, преобразовывали данные обратно в исходную схему).

Смежные вопросы