Удалить кортеж и создать новый отсортированный список - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть RDD , который я создал с помощью PySpark и размером около 600 ГБ после объединения по значению ключа, которое выглядит точно так же.

[('43.72_-70.08', (('0744632', -70.08, 43.72, '2.4'), '18090865')),
 ('43.72_-70.08', (('0744632', -70.08, 43.72, '2.4'), '18090865')),
 ('43.25_-67.58', (('0753877', -67.58, 43.25, '7.2'), '18050868')),
 ('43.01_-75.24', (('0750567', -75.24, 43.01, '7.2'), '18042872'))]

Я хочу что-то вроде этого и отсортировано по первому элементу:

['0744632', '18090865', '2.4',
'0744632', '18090865', '2.4',
'0750567', '18042872', '7.2',
'0753877', '18050868', '7.2']

Есть ли способ получить данные из кортежей и получить выходные данные в требуемом формате.

Примечание. Это СДР емкостью 600 ГБ с более чем миллионом различных значений в первом столбце и приблиз. 15 миллиардов строк, я был бы очень признателен за оптимизированный способ, если это возможно.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Это простое однострочное решение

sorted([(x[1][0][0], x[1][1], x[1][0][3]) for x in your_list]) 

Я думаю, что это немного быстрее, чем лямбда-решение, основанное на этом посте. В чем разница между этими двумя решениями - лямбда или петля - Python

0 голосов
/ 27 апреля 2018

Аналогично другому ответу Spark:

rdd=rdd.map(lambda (a,(b,c)): [b[0], c, b[3]])\
       .sortBy(lambda row: row[0])

Вы также можете использовать уменьшение вместо flatMap:

rdd.reduce(lambda x,y: x+y)
0 голосов
/ 27 апреля 2018

Сделайте это в вашем искровом кластере, например ::10000

In []:
(rdd.map(lambda x: (x[1][0][0], x[1][1], x[1][0][2]))
 .sortBy(lambda x: x[0])
 .flatMap(lambda x: x)
 .collect())

Out[]:
['0744632', '18090865', 43.72, '0744632', '18090865', 43.72, '0750567', 
 '18042872', 43.01, '0753877', '18050868', 43.25]

С другой стороны

In []:
import operator as op

(rdd.map(lambda x: (x[1][0][0], x[1][1], x[1][0][2]))
 .sortBy(lambda x: x[0])
 .reduce(op.add))

Out[]:
('0744632', '18090865', 43.72, '0744632', '18090865', 43.72, '0750567', 
 '18042872', 43.01, '0753877', '18050868', 43.25)

Это выглядит довольно громоздкой структурой, если вы имели в виду список кортежей, то просто исключите flatMap():

In []:
(rdd.map(lambda x: (x[1][0][0], x[1][1], x[1][0][2]))
 .sortBy(lambda x: x[0])
 .collect())

Out[]:
[('0744632', '18090865', 43.72),
 ('0744632', '18090865', 43.72),
 ('0750567', '18042872', 43.01),
 ('0753877', '18050868', 43.25)]
...