takeOrdered没有在Pyspark工作以获得逆序

时间:2016-10-17 07:01:31

标签: hadoop apache-spark pyspark

当我试图获得前三个元素时,它可以正常工作,但按相反的顺序,它不起作用

angular.module('app')
.run(['$state', '$cookies', '$rootScope', function($state, $cookies, $rootScope) {
    $rootScope.$on('$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {

        $rootScope.tabName  = fromState.name;       
    });
});

以上陈述可以正常使用

当试图吼叫它出错了

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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