import sys
from operator import add
from pyspark import SparkContext
if __name__ == "__main__":
#打开README.md文件
sc = SparkContext(appName="PythonWordCount")
textFile = sc.textFile('README.md')
#1.基本RDD操作
#actions: 在数据集上运行计算后返回值
print textFile.count() # 计数,返回RDD中items的个数,这里就是README.md的总行
print textFile.first() # RDD中的第一个item,这里就是文件README.md的第一行
#transformations: 转换, 从现有数据集创建一个新的数据集
textFileWithSpark = textFile.filter(lambda line: "spark" in line)#使用filter这一转换返回一个新的RDD,这些RDD中的items都含有“Spark”字符串。
print textFileWithSpark.count()
#2.更多的RDD操作
print textFile.map(lambda line: len(line.split())).reduce(lambda a, b: a if (a>b) else b) #我们希望找到含有最后单词的一句话:
'''
这个语句中,map函数将len(line.split())这一语句在所有line上执行,返回每个line所含有的单词个数,也就是将line都map到一个整数值,
然后创建一个新的RDD。然后调用reduce,找到最大值。map和reduce函数里的参数是python中的匿名函数(lambda),事实上,我们这里也可以传递python中
更顶层的函数。比如,我们先定义一个比较大小的函数,这样我们的代码会更容易理解:
'''
def max(a, b):
if a > b:
return a
else:
return b
print textFile.map(lambda line: len(line.split())).reduce(max)
#Hadoop掀起了MapReduce的热潮。在spark中,能够更加容易的实现MapReduce
wordCounts = textFile.flatMap(lambda line: line.split()).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)
'''
上述语句中,利用flatMap, map和reduceByKey三个转换,计算文件README.md中每个单词出现的个数,并返回一个新的RDD,
每个item的格式为(string, int),即单词和对应的出现次数。其中,flatMap(func):与map相似,但是每个输入的item能
够被map到0个或者更多的输出items上,也就是说func的返回值应当是一个Seq,而不是一个单独的item,上述语句中,匿名函数
返回的就是一句话中所含的每个单词reduceByKey(func):可以作用于使用“键-值”(K, V)形式存储的数据集上并
返回一组新的数据集(K, V),其中,每个键的值为聚合使用func操作的结果,这里相当于python中字典的含义。上述语句中
,相当于当某个单词出现一次时,就在这个单词的出现次数上加1,每个单词就是一个Key,reducByKey中的匿名函数计算单词的出现次数。
'''
print wordCounts.collect()#要收集上述语句的计算结果,可以使用collect这一动作:
#3. 缓存Caching
print textFileWithSpark.cache()
print textFileWithSpark.count()
#4. 自含式应用程序(self-contained applications)
sc.stop()
Spark (Python版) 学习笔记(一)
最新推荐文章于 2024-06-23 17:25:39 发布