《Learning Spark》这本书算是Spark入门的必读书了,中文版是《Spark快速大数据分析》,不过豆瓣书评颇有意思的是,英文原版评分7.4,评论都说入门而已深刻不足,中文译版评分8.4,评论一片好评,有点意思。我倒以为这本书能够做为官方文档的一个补充,刷完后基本上对Spark的一些基本概念、码简单的程序是没有问题的了。这本书有一个好处是它是用三门语言写的,Python/Java/Scala,因此适用性很广,个人观点是,先精通一门语言,再去学其余语言。因为我工做中比较经常使用的是Python,因此就用把Python相关的命令总结一下。下一阶段再深刻学习Java和Scala。这一篇总结第一章-第三章的重点内容。shell
1 A = [1,2,3,4,5] 2 lines = sc.parallelize(A) 3 #另外一种方式
4 lines = sc.parallelize([1,2,3,4,5])
map( )和flatMap( )的联系和区别 缓存
map( ):接收一个函数,应用到RDD中的每一个元素,而后为每一条输入返回一个对象。
filter( ):接收一个函数,将函数的元素放入新的RDD中返回。
flatMap( ):接收一个函数,应用到RDD中的每一个元素,返回一个包含可迭代的类型(如list等)的RDD,能够理解为先Map(),后flat().
1 distinct( )、union( )、intersection( )、subtract( ) 2 distinct( ):去重 3 union( ):两个RDD的并集 4 intersection( ):两个RDD的交集 5 subtract( ):两个RDD的补集 6 cartesian( ):两个RDD的笛卡尔积(能够应用于计算类似度中,如计算各用户对各类产品的预期兴趣程度)
1 reduce( ):接收一个函数做为参数,这个函数要操做两个相同元素类型的RDD,也返回一个一样类型的RDD,能够计算RDD中元素的和、个数、以及其余聚合类型的操做。 2 3 fold( ):和reduce同样,但须要提供初始值。 4 5 aggregate( ):和fold相似,但一般返回不一样类型的函数。 6 7 注:
关于fold()和aggregate(),再说点题外话。fold()只能作同构聚合操做,就是说,若是你有一个RDD[X],经过fold,你只能构造出一个X。可是若是你想经过RDD[X]构造一个Y呢?那就得用到aggregate()了,使用aggregate时,须要提供初始值(初始值的类型与最终返回的类型相同),而后经过一个函数把一RDD的元素合并起来放到累加器里,再提供一个函数将累加器两两相加。由此能够看出,fold()须要保证灭个partition可以独立进行运算,而aggregate()对于不一样partition(分区)提交的最终结果专门定义了一个函数来进行处理。
RDD还有不少其余的操做命令,譬如collect(),count(),take(),top(),countByValue(),foreach()等,限于篇幅,就不一一表述了。分布式
1 class MyClass(object): 2 def __init__(self): 3 self.field = “Hello” 4
5 def doStuff(self, rdd): 6 #报错:由于在self.field中引用了整个self
7 return rdd.map(lambda s: self.field + x)
解决方法:直接把你须要的字段拿出来放到一个局部变量里,而后传递这个局部变量就能够了。函数
1 class MyClass(object): 2 def __init__(self): 3 self.field = “Hello” 4
5 def doStuff(self, rdd): 6 #将须要的字段提取到局部变量中便可
7 field = self.field 8 return rdd.map(lambda s: field + x)
前面三章讲了Spark的基本概念和RDD的特性以及一些简单的命令,比较简单。后面三章主要讲了键值对操做、数据的读取和保存以及累加器、广播变量等,下周再更新。性能