Операция RDD для сортировки значений в pyspark - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть следующий формат файла:

0, Alpha,-3.9, 4, 2001-02-01, 5, 20
0, Beta,-3.8, 3, 2002-02-01, 6, 21
1, Gamma,-3.7, 8, 2003-02-01, 7, 22
0, Alpha,-3.5, 4, 2004-02-01, 8, 23
0, Alpha,-3.9, 4, 2005-02-01, 8, 27

Я хочу отсортировать отдельные 1st elements в каждой строке по 3rd elements с помощью операции rdd. Я предпочитаю получать следующий вывод:

(Beta, 3)
(Alpha, 4)
(Gamma, 8)

Это то, что я сделал в данный момент,

rdd = sc.textFile(myDataset)
list_ = rdd.map(lambda line: line.split(",")).map(lambda e : e[1]).distinct().collect() 
new_ = list_.sortBy(lambda e : e[2])

Но я не мог отсортировать, как хотел. Кто-нибудь может сказать, как сделать эту только основанную на RDD операцию?

1 Ответ

1 голос
/ 10 ноября 2019

rdd = sc.textFile(myDataset) правильно.

list_ = rdd.map(lambda line: line.split(",")).map(lambda e : e[1]).distinct().collect() 
new_ = list_.sortBy(lambda e : e[2]) # e[2] does not exist.

Вы уже вызвали сбор на list_, поэтому он больше не является СДР. Затем вы перешли на sortBy, так что он не будет работать. Возможно, вы сделали эту ошибку при публикации. Основной вопрос - операция с картой. Вам нужно создать pairWiseRdd , но вы не создали его. Следовательно, нет e[2] для сортировки. См. Ниже.

>>> rdd.map(lambda line: line.split(",")).map(lambda e : e[1]).collect()
[' Alpha', ' Beta', ' Gamma', ' Alpha', ' Alpha']

Выше не будет иметь значение, которое вам нужно использовать distinct() Вместо этого вам нужно сделать это

>>> list_ = rdd.map(lambda line: line.split(",")).map(lambda e : (e[1],e[3]))
>>> list_.collect()
[(' Alpha', ' 4'),
 (' Beta', ' 3'),
 (' Gamma', ' 8'),
 (' Alpha', ' 4'),
 (' Alpha', ' 4')]
>>> distinct_rdd = list_.distinct() #making stuff distinct
>>> distinct_rdd.collect()
[(' Alpha', ' 4'), (' Beta', ' 3'), (' Gamma', ' 8')]

Теперь, когда мы сделали нашу pairWiseRddмы можем использовать второе значение каждой пары, чтобы отсортировать его.

>>> sorted_rdd = distinct_rdd.sortBy( lambda x:x[1] )
>>> sorted_rdd.collect()
[(' Beta', ' 3'), (' Alpha', ' 4'), (' Gamma', ' 8')]
...