takeordered不能在pyspark中反向工作

2guxujil  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(239)

当我试着得到前3个元素时,它工作得很好,但按相反的顺序它不工作

sc.textFile("/user/sachinkerala6174/inData/movieStat").takeOrdered(3)

上面的说法行得通
当你试着吼叫的时候,它被吓坏了

sc.textFile("/user/sachinkerala6174/inData/movieStat").takeOrdered(3,key=lambda x: -x)

输入数据

196 5   3   881250949
186 5   3   891717742
22  1   1   878887116
244 1   2   880606923
166 3   1   886397596
298 4   4   884182806
115 2   2   881171488
253 4   5   891628467
305 4   3   886324817
6   4   3   883603013
62  2   2   879372434
286 1   5   879781125
200 2   5   876042340
210 4   3   891035994
224 2   3   888104457
303 5   3   879485318
122 3   5   879270459
194 2   2   879539794

将错误作为

File "/usr/lib64/python2.7/heapq.py", line 427, in nsmallest
    result = _nsmallest(n, it)
  File "<stdin>", line 1, in <lambda>
TypeError: bad operand type for unary -: 'unicode'
o3imoua4

o3imoua41#

当lambda函数试图计算字符串的负值时,代码失败。在pyspark中(与scala和java不同),没有方法反转 TakeByOrdered 但是,您可以通过使用zipwithindex向每个输入行添加行号来实现相同的目的。这将为您提供以下输出格式:

[('196 5   3   881250949', 0), ('186 5   3   891717742', 1), ....]

然后,您可以使用long索引作为排序键,以便获取输入文件的最后三行:

lastLines = sc.textFile("/user/sachinkerala6174/inData/movieStat").
zipWithIndex().takeOrdered(3,key=lambda x:-x[1])

使用 map 然后您只能返回最后三行:

map(lambda x:x[0], lastLines)

相关问题