PySpark - 按第二列对 RDD 进行排序

Posted

技术标签:

【中文标题】PySpark - 按第二列对 RDD 进行排序【英文标题】:PySpark - Sort RDD by Second Column 【发布时间】:2018-12-07 14:43:43 【问题描述】:

我有这个 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】:

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

一种方法是在lambda 内对line 的长度进行条件检查:

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

【讨论】:

以上是关于PySpark - 按第二列对 RDD 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何通过android中的数值列对listview项进行排序

C++ 按列对二维向量进行排序

C#按多列对多维数组进行排序

Pandas Dataframe 按列排序[重复]

对单元格范围进行排序,win32com.client

Bash:按前 4 列对 csv 文件进行排序