在python map-reduce中,如何以最大值打印密钥?

时间:2017-11-21 11:26:33

标签: python hadoop

我有一个python mapreduce程序,它接受这样的列表输入。

[0, [199705, 213905, 212829, 13457, 111686, 607393, 872608, 732377, 182538, 787881, 118319, 964795, 166968, 365009, 894771, 613260, 641339, 25337, 34115, 893819, 795572, 685695, 312904, 907582, 871031, 166572, 677524, 579547, 293532, 823144, 475466, 809697, 941561, 691401, 933961, 968512, 533541, 65023, 553086, 644441, 448130, 721938, 404353, 430226, 391164, 805168, 119856, 322218, 657328, 433268]]
[1, [347154, 517159, 919812, 929796, 522835, 759868, 683323, 445616, 940315, 862788, 290265, 955975, 453456, 295093, 884128, 748140, 456509, 449460, 676630, 112028, 891628, 927525, 246077, 249585, 430901, 582551, 889207, 115453, 124599, 985059, 5141, 689344, 396875, 770571, 246748, 643185, 573140, 161546, 734303, 872849, 931835, 793428, 678324, 534229, 928903, 211030, 227042, 669851, 545325, 494357]]

总共有20个列表。我必须在全局中输出所有这些整数中的最大整数。这是我的代码。

def mapper(key, value):
    print(key,max(value))

def reducer(key, list_of_values):
    print(max(list_of_values))

它给了我这样的输出。它打印出每个列表中的最大整数,并且它会这样做20次(20个映射器)。

955177
957396
968512
972704
977466
982293
982751
983684
985059
987475
988109
988774
995432
995598
996172
996581
997120
998921
999030
999657

这是20个列表中的行。我怎样才能得到单个最大整数的输出?

3 个答案:

答案 0 :(得分:0)

在纯Python中执行此操作的一种简单方法是使用max两次使用生成器表达式。内部max获取每个子列表的最大值,外部子列表获得这些最大值的最大值。

data = [
    [0, [199705, 213905, 212829, 13457, 111686, 607393, 872608, 732377]],
    [1, [347154, 517159, 919812, 929796, 522835, 759868, 683323, 445616]],
]

print(max(max(u[1]) for u in data))

<强>输出

 929796

可以以更实用的方式执行此操作:

def mapper(row):
    return max(row[1])

print(max(map(mapper, data)))

但我认为以前的版本更具可读性,而且可能更快。

答案 1 :(得分:0)

至少对我而言,规范解决方案是将chain列表放在一起,以便只有一个可迭代的整数。然后应用max函数。

>>> data = [
    [0, [199705, 213905, 212829, 13457, 111686, 607393, 872608, 732377]],
    [1, [347154, 517159, 919812, 929796, 522835, 759868, 683323, 445616]],
] # example copy-pasted from PM 2Ring :)
>>>
>>> from itertools import chain
>>> max(chain.from_iterable(s[1] for s in data))
929796

更具功能性:

>>> from operator import itemgetter
>>> get_second = itemgetter(1)
>>> max(chain.from_iterable(map(get_second, data)))
929796

或没有进口:

>>> max(number for sublist in data for number in sublist[1])
929796

答案 2 :(得分:0)

如果它在将来帮助任何人,那么与键数一样多的映射器(和缩减器)。所以我将关键变量初始化为0。

def mapper(key, value):
    key = 0
    print key, max(value)

将减速器数量减少到1,解决了这个问题。感谢@ PM2Ring和@timgeb的回复。