如何在不使用任何sort命令参数的情况下进行下降排序

时间:2013-08-23 09:06:47

标签: python shell hadoop hadoop-streaming

现在我想在不使用任何sort命令参数的情况下进行降序排序。所以我想出一种方法,让每个值多次-1,最大值为min,min将是max.And因为sort comand是按第一个值排序,如果没有添加任何命令参数。所以我打印格式值,让每个值都有相同的位。这种方式将用于map-reduce。 映射器代码:

import sys
import re
for line in sys.stdin:
    adver_num=0
    line=line.strip()
    words=line.split('\t')
    adver_num= (-1)*(int(words[0]))
    print"%09.0f\t%s\t%s"%(adver_num,words[1],words[2])

然后cat a.log | python mapper.py | sort>博客。 而b.log,似乎减号仍然不起作用。

b.log中的最后一行如下所示。似乎sort命令没有考虑minuse。我该如何修复它?

-00026844
-00027621
-00029789
-00029848
-00030789
-00032120
-00034452
-00034458
-00037064
-00038644

2 个答案:

答案 0 :(得分:1)

您可以使用sorted(iterable, cmp=None, key=None, reverse=False)功能。 您可以在此处找到详细信息:http://docs.python.org/2/library/functions.html#sorted

答案 1 :(得分:0)

没有选项的

sort将按词汇排序,因此-2仅在-3之前,因为它们被视为字符串,而不是数字。使用sort -n来解决这个问题,或继续阅读。

如果您有一个上限值(第一列可以采用的最大最大值),那么您可以从中减去。为了避免管道中的其他算术运算,您可以将其添加为前缀,然后在排序后将其删除(另请参阅Schwartzian transform)。

假设最大值永远不会超过10,000,000。然后你可以规定这是理论上的最大值,并做一些像

这样的事情
import sys
import re
ceiling=10000000
for line in sys.stdin:
    line=line.strip()
    words=line.split('\t')
    sortkey=ceiling-int(words[0])
    print "%09.0f\t%s\t%s\t%s" % (sortkey, words[0],words[1],words[2])

然后你可以在排序后剥离第一列。

python a.py <a.log | sort | cut -f2- >a.out

如果您对将整个数据集读入内存感到满意(例如@ViktorKerkez'的答案),那么您可以使用最大值,并可以将其用作上限值。这有一个明显的缺点,就是你不能处理一个不适合内存的数据集(由于交换,一个不适合物理内存的数据集处理起来会非常慢)。