首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PySpark -按第二列排序RDD

PySpark -按第二列排序RDD
EN

Stack Overflow用户
提问于 2018-12-07 14:43:43
回答 1查看 363关注 0票数 1

我有个RDD:

代码语言:javascript
运行
复制
[[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']]

我想按第二列(名字)进行排序。我试过,但没有成功:

代码语言:javascript
运行
复制
[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']

我试着用这个:

代码语言:javascript
运行
复制
sorted = employee_rows.sortBy(lambda line: line[1])

但它给了我这个:

代码语言:javascript
运行
复制
IndexError: list index out of range

怎么能按第二栏分类呢?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-07 15:26:42

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

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

代码语言:javascript
运行
复制
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定义自定义排序函数。下面是一种使“坏”行排序到最后的方法:

代码语言:javascript
运行
复制
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'']]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53671759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档