码迷,mamicode.com
首页 > 编程语言 > 详细

Spark示例之数组排序

时间:2015-02-27 00:23:48      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

数组排序是一个常见的操作。基于比较的排序算法其性能下限是O(nlog(n)),但在分布式环境下面我们可以并发,从而提高性能。这里展示了Spark中数组排序的实现,并分析了性能,同时尝试找到导致性能提升的原因。

官方示例

import sys
 
from pyspark import SparkContext
 
if __name__ == "__main__":
    if len(sys.argv) != 2:
        print >> sys.stderr, "Usage: sort <file>"
        exit(-1)
    sc = SparkContext(appName="PythonSort")
    lines = sc.textFile(sys.argv[1], 1)
    sortedCount = lines.flatMap(lambda x: x.split(' '))         .map(lambda x: (int(x), 1))         .sortByKey(lambda x: x)
    # This is just a demo on how to bring all the sorted data back to a single node.
    # In reality, we wouldn't want to collect all the data to the driver node.
    output = sortedCount.collect()
    for (num, unitcount) in output:
        print num
 
    sc.stop()

所有Spark应用的入口都是SparkContext的实例。它是整个Spark环境的一个抽象。考虑都分布环境的复杂性,如果编程时还要考虑数据集的划分以及哪台机子上面计算,那么Spark的可用性将大大降低。SparkContext的实例就是整个环境的入口,就想汽车的操作界面一样,编程时只要调用相应的接口,传入数据,它就会在分布式系统中分发和执行,并尽可能达到最大的性能。在程序的最后,还要调用其stop方法来断开环境。

方法textFile读入一个文本文件,并在Spark环境里创建相应的RDD集。这个数据集存放在lines变量中。方法flatMapmap不同,map返回的是一个key,value的对,得到的RDD集和哈希表有点像。而flatMap的输出结果是数组。这个数组是对每个元素调用传入的lambda函数后得到的结果的并。这意味着传入的lambda函数可以返回0个或多个结果,比如:

>>> rdd = sc.parallelize([2, 3, 4])
>>> sorted(rdd.flatMap(lambda x: range(1, x)).collect())
[1, 1, 1, 2, 2, 3]

接着调用map方法把每个数组都变成(key,value)的形式,最后使用sortByKey来进行排序。排好序后得RDD集是sortedCount,调用其collect方法即可返回集里面的数据。

容易看出,这段程序实际上只是调用了Spark提供的排序接口sortByKey,而不是在代码中实现一个排序算法。方法sortByKey的底层实现如下:

def sortByKey(ascending: Boolean = true, numPartitions: Int = self.partitions.size)      
	: RDD[(K, V)] =  {    
	val part = new RangePartitioner(numPartitions, self, ascending)    
	new ShuffledRDD[K, V, V](self, part)      
		.setKeyOrdering(if (ascending) ordering else ordering.reverse)  
}

其思路就是将数据分成不想交的区间(区间的数目默认为RDD分区的个数),然后再单独对每个区间使用排序算法。这个实现十分优雅,只用了两行代码。假设分区的个数是m,数据集的大小为n,可以预期其时间复杂度为O((n/m)log(n))Spark的一个分区会执行一个task,最终效果跟并行执行是一样的。

访问本人博客获得更多信息:magic01

Spark示例之数组排序

标签:

原文地址:http://blog.csdn.net/alburthoffman/article/details/43957795

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!