PySpark-按第二列对RDD排序

时间:2018-12-07 14:43:44

标签: sorting apache-spark pyspark rdd

我有这个RDD:

[[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 :(得分:2)

通常,您应该使所有高阶rdd函数都对不良输入具有鲁棒性。在这种情况下,您的错误是因为您至少有一条没有第二列的记录。

一种方法是对linelambda的长度进行条件检查:

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'']]