首页 文章

如何在 Spark 中按值对 Nested-List 结构的 RDD 进行排序?

提问于
浏览
0

我有一个具有以下(键,值)格式的 RDD:

[((u'en', 1),[('term1', 2),('term2', 8),('term3', 6))]

如前所述,value是元组列表:(term,count)

我试图使用以下值对 rdd 进行排序:

.map(lambda (a,b): (b,a)).sortByKey(False).map(lambda (a,b): (b,a))

但是它产生了由termcount排序的 RDD

问题是如何用count对 RDD 进行排序,只产生以下内容:

[((u'en', 1),[('term2', 8),('term3', 6),('term1', 2))]

2 回答

  • 2

    假设您的 RDD 由键,值对组成,其中键本身是一个元组,而值是一个元组列表,并且您只希望对该元组列表进行排序:

    rdd.map(lambda (k, v): (k, sorted(v, key=lambda x: x[1], reverse=True)))
    

    如果要通过键元组(('en', 2)中的 2)的计数进一步对结果进行排序,可以执行以下操作:

    rdd.map(lambda (k, v): (k, sorted(v, key=lambda x: x[1], reverse=True)))
       .sortBy(lambda (k, v): k[1], False)
    
  • 1

    我不确定是否完全理解您的问题,但是我认为您想使用每个tuple的第二个值对List进行排序,这是每个RDD条目的值。

    from operator import itemgetter
    
    rdd = sc.parallelize([("a", [("x", 1), ("y", 2), ("z", 3), ("a", 4), ("b", 5)]), 
                          ("b", [("u", 7), ("d", 6),("p", 5), ("v", 8), ("b", 10)])])
    rdd.collect()
    
    # [('a', [('x', 1), ('y', 2), ('z', 3), ('a', 4), ('b', 5)]),
    #  ('b', [('u', 7), ('d', 6), ('p', 5), ('v', 8), ('b', 10)])]
    
    rdd = rdd.map(lambda (k, l): (k, sorted(l, key=itemgetter(0), reverse=True)))
    rdd.collect()
    
    # [('a', [('b', 5), ('a', 4), ('z', 3), ('y', 2), ('x', 1)]),
    #  ('b', [('b', 10), ('v', 8), ('u', 7), ('d', 6), ('p', 5)])]
    

    您可以找到其他方式对list s 用 Python 排序列表进行排序。

相关问题