PySpark 如何按值排序,如果值相等按键排序?
PySpark how to sort by a value, if the values are equal sort by the key?
例如:
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 函数可以解决这个问题?
您可以按第二个元素排序,然后是第一个元素:
sc.parallelize(tmp).sortBy(lambda x: [x[1], x[0]]).collect()
[('a', 1), ('b', 1), ('e', 1), ('f', 3), ('d', 4), ('c', 5)]
例如:
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 函数可以解决这个问题?
您可以按第二个元素排序,然后是第一个元素:
sc.parallelize(tmp).sortBy(lambda x: [x[1], x[0]]).collect()
[('a', 1), ('b', 1), ('e', 1), ('f', 3), ('d', 4), ('c', 5)]