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

vh0rcniy  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(409)

现在我想做下降排序,不使用任何排序命令参数。所以我想一种方法,让每个值乘以-1,最大值就是最小值,最小值就是最大值。然后因为排序comand是按第一个值排序的,如果不加任何comand参数。所以我打印格式值,让每个值都有相同的位。这种方法将用于map reduce。Map程序代码:

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,似乎负数仍然不起作用。
b.log中的最后一行显示如下。似乎sort命令没有考虑负数。如何修复它?

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

0wi1tuuw1#

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

y53ybaqx

y53ybaqx2#

sort 如果没有选项,将按词汇排序,所以 -2 在之前 -3 只是因为它们被当作字符串,而不是数字。使用 sort -n 或者继续读下去。
如果有一个上限值(第一列可以取的最大值),那么可以从中减去。为了避免额外的计算,您可以将其添加为前缀,然后在排序后将其剥离(另请参见schwartzian变换)。
假设最大值不能超过10000000。然后你可以把它规定为理论上的最大值

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的回答),那么您只需要获得最大可用值,并可以将其用作上限值。这有一个明显的缺点,即您不能处理不适合内存的数据集(而且由于交换,不适合物理内存的数据集处理起来会非常慢)。

相关问题