PySpark - сортировка RDD по второму столбцу - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть этот СДР:

[[u''], [u'E01', u'Lokesh'], [u'E10', u'Venkat'], [u'EO2', u'Bhupesh'], [u'EO3', u'Amit'], [u'EO4', u'Ratan'], [u'EO5', u'Dinesh'], [u'EO6', u'Pavan'], [u'EO7', u'Tejas'], [u'EO8', u'Sheela']]

И я хочу отсортировать по второму столбцу (имя).Я пытаюсь это, но безуспешно:

[u'EO3', u'Amit'], 
[u'EO2', u'Bhupesh'], 
[u'EO5', u'Dinesh'], 
[u'E01', u'Lokesh'], 
[u'EO6', u'Pavan'],
[u'EO8', u'Sheela'],
[u'EO7', u'Tejas'],
[u'E10', u'Venkat']

Я пытаюсь с этим:

sorted = employee_rows.sortBy(lambda line: line[1])

Но это дает мне это:

IndexError: list index out of range

Как можно сортировать по второмуколонка?

Спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

В общем, вы должны сделать все ваши rdd-функции более высокого порядка устойчивыми к неверным входам.В этом случае ваша ошибка заключается в том, что у вас есть хотя бы одна запись, у которой нет второго столбца.

Один из способов - это поставить условие проверки длины line внутри lambda:

employee_rows.sortBy(lambda line: line[1] if len(line) > 1 else None).collect()
#[[u''],
# [u'EO3', u'Amit'],
# [u'EO2', u'Bhupesh'],
# [u'EO5', u'Dinesh'],
# [u'E01', u'Lokesh'],
# [u'EO6', u'Pavan'],
# [u'EO4', u'Ratan'],
# [u'EO8', u'Sheela'],
# [u'EO7', u'Tejas'],
# [u'E10', u'Venkat']]

Или вы можете определить пользовательскую функцию сортировки с помощью try/except.Вот способ сортировки «плохих» строк последним:

def mysort(line):
    try:
        return line[1]
    except:
        # since you're sorting alphabetically
        return 'Z'

employee_rows.sortBy(mysort).collect()
#[[u'EO3', u'Amit'],
# [u'EO2', u'Bhupesh'],
# [u'EO5', u'Dinesh'],
# [u'E01', u'Lokesh'],
# [u'EO6', u'Pavan'],
# [u'EO4', u'Ratan'],
# [u'EO8', u'Sheela'],
# [u'EO7', u'Tejas'],
# [u'E10', u'Venkat'],
# [u'']]
...