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如何按值排序,如果值相等,按键排序?的主要内容,如果未能解决你的问题,请参考以下文章

HashMap按键排序和按值排序

HashMap按键排序和按值排序

如何先按值对 std::map 排序,然后按键排序?

Java Map按键(Key)排序和按值(Value)排序

按值然后键对字典进行排序

如何按值和键的多个条件对嵌套字典进行排序?