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 进行排序的主要内容,如果未能解决你的问题,请参考以下文章