接触到spark,才觉得很多东西并不是想象的那么简单的,不过这个并不能影响什么情绪,对于这个平台我还是很愿意多花点时间去学习熟悉一下的,忙里偷闲,找点时间,今天按照官方的API简单实践一下sort排序的内容,这些在我之前的博客里面有多很多讲解,都是借助python来原生态地实现的,这里是想用spark来做一下这个事情,主要包括两种,一种是读取数据文件进而对数据文件中的内容进行排序;另一种是直接输入数据列表来进行排序,下面是具体的实践。
#!usr/bin/env python
#encoding:utf-8
'''
__Author__:沂水寒城
功能:基于 spark 的排序
'''
import sys
import time
import random
from operator import gt
from pyspark.sql import SparkSession
from pyspark import SparkContext, SparkConf
# conf=SparkConf().setAppName('PSApp').setMaster('local')
# sc=SparkContext(conf=conf)
def sortFromFile(data_path='sort.txt'):
'''
从文件读取数据进行排序
'''
spark=SparkSession.builder.appName("PSApp").getOrCreate()
lines = spark.read.text(data_path).rdd.map(lambda r: r[0])
sortedCount=lines.flatMap(lambda x: x.split(' ')).map(lambda x: (int(x), 1)).sortByKey()
output=sortedCount.collect()
print 'output: ',output
for (num, unitcount) in output:
print num
spark.stop()
def sortFromList(data_list):
'''
对列表数据进行排序
'''
conf=SparkConf().setAppName('PSApp').setMaster('local')
sc=SparkContext(conf=conf)
rdd=sc.parallelize(data_list)
res_list=rdd.sortBy(lambda x: x).collect()
print 'res_list: ',res_list
return res_list
sc.stop()
def timeCompare(num=10000):
'''
时间消耗对比
'''
data_list1,data_list2=[],[]
for i in range(num):
one_num=random.randint(-1000000,1000000)
data_list1.append(one_num)
data_list2.append(one_num)
s1=time.time()
data_list1.sort()
s2=time.time()
res_list=sortFromList(data_list2)
s3=time.time()
print 'data_list1==res_list: ',data_list1==res_list
print 'python time is: ',s2-s1
print ' spark time is: ',s3-s2
if __name__ == "__main__":
sortFromFile(data_path='sort.txt')
data_list=[123,3,4,657,0,234,21,3,4,-11,12334,-37,5567,43,222,3333,4563,6]
sortFromList(data_list)
timeCompare(num=10000)
timeCompare(num=100000)
timeCompare(num=1000000)
排序结果如下:
output: [(-3, 1), (0, 1), (3, 1), (3, 1), (5, 1), (6, 1), (7, 1), (12, 1), (31,
1), (32, 1), (34, 1), (45, 1), (77, 1), (90, 1), (99, 1), (111, 1), (222, 1), (
333, 1), (450, 1), (452, 1), (456, 1), (678, 1), (1112, 1), (656757, 1)]
-3
0
3
3
5
6
7
12
31
32
34
45
77
90
99
111
222
333
450
452
456
678
1112
656757
res_list: [-37, -11, 0, 3, 3, 4, 4, 6, 21, 43, 123, 222, 234, 657, 3333, 4563,
5567, 12334]
处于好奇,我想简单比对一下spark的排序效率和python原生态地排序功能谁更加强大一点,于是乎,做了一点小小的对比试验,可能是我的机子比较次吧,spark排序的性能均劣于python,不过这个仅仅是一个小实验哈
data_list1==res_list: True
python time is: 0.00200009346008
spark time is: 0.908999919891
data_list1==res_list: True
python time is: 0.0309998989105
spark time is: 0.503000020981
data_list1==res_list: True
python time is: 0.530999917984
spark time is: 3.49399995804
学习了!