PySpark如何按值排序,如果值相等,按键排序?
Posted
技术标签:
【中文标题】PySpark如何按值排序,如果值相等,按键排序?【英文标题】:PySpark how to sort by a value, if the values are equal sort by the key? 【发布时间】:2021-02-13 12:40:10 【问题描述】:例如:
tmp = [('a', 1), ('e', 1), ('b', 1), ('f', 3), ('d', 4), ('c', 5)]
sc.parallelize(tmp).sortBy(lambda x: x[1]).collect()
# in this way, it only sorts the value.
[('a', 1), ('e', 1), ('b', 1), ('f', 3), ('d', 4), ('c', 5)]
我想要的是如果两个值相等,然后比较键('a','b','c','d' ...)
预期的输出是:
[('a', 1), ('b', 1), ('e', 1), ('f', 3), ('d', 4), ('c', 5)]
我知道通过两次使用sortBy
很容易实现这一点,首先对键进行排序,然后对值进行排序。但是,我认为如果数据集是分布式的,这可能是不可行的。
有没有什么 lambda 函数可以解决这个问题?
【问题讨论】:
【参考方案1】:您可以按第二个元素排序,然后是第一个元素:
sc.parallelize(tmp).sortBy(lambda x: [x[1], x[0]]).collect()
[('a', 1), ('b', 1), ('e', 1), ('f', 3), ('d', 4), ('c', 5)]
【讨论】:
感谢您的回答,但是通过这种方式,它可以以相同的升序对两个元素进行排序。例如,我想按降序对值进行排序,但按升序对键进行排序。 @DennisLi 如果要按降序排序,可以添加负号,例如[-x[1], x[0]]
@DennisLi 或者您可以指定ascending=False
(参见docs),但这将适用于整个排序功能。以上是关于PySpark如何按值排序,如果值相等,按键排序?的主要内容,如果未能解决你的问题,请参考以下文章