【问题标题】:PySpark - Sort RDD by Second ColumnPySpark - 按第二列对 RDD 进行排序
【发布时间】: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

如何按第二列排序?

谢谢!

【问题讨论】:

    标签: sorting apache-spark pyspark rdd


    【解决方案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'']]
    

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2012-06-29
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多