如何按Spark中的值对嵌套列表结构的RDD进行排序?
How to sort RDD of Nested-List Structure by Value in Spark?
我有一个具有以下(键,值)格式的 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))
但是它生成了一个按 term
和 count
排序的 RDD
问题是如何按 count
对这个 RDD 进行排序,只生成以下内容:
[((u'en', 1),[('term2', 8),('term3', 6),('term1', 2))]
我不完全确定我理解你的问题,但我认为你想对 List
进行排序,这是每个 RDD
条目的值,使用每个 RDD
的第二个值tuple
.
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 Sorting lists in Python.
进行排序
假设您的 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)
我有一个具有以下(键,值)格式的 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))
但是它生成了一个按 term
和 count
问题是如何按 count
对这个 RDD 进行排序,只生成以下内容:
[((u'en', 1),[('term2', 8),('term3', 6),('term1', 2))]
我不完全确定我理解你的问题,但我认为你想对 List
进行排序,这是每个 RDD
条目的值,使用每个 RDD
的第二个值tuple
.
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 Sorting lists in Python.
假设您的 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)