《Learning Spark》这本书算是Spark入门的必读书了,中文版是《Spark快速大数据分析》,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足,中文译版评分8.4,评论一片好评,有点意思。我倒觉得这本书可以作为官方文档的一个补充,刷完后基本上对Spark的一些基本概念、码简单的程序是没有问题的了。这本书有一个好处是它是用三门语言写的,Python/Java/Scala,所以适用性很广,我的观点是,先精通一门语言,再去学其他语言。由于我工作中比较常用的是Python,所以就用把Python相关的命令总结一下。下一阶段再深入学习Java和Scala。这一篇总结第一章-第三章的重点内容。

 
  说到Spark,就不得不提到RDD,RDD,字面意思是弹性分布式数据集,其实就是分布式的元素集合。Python的基本内置的数据类型有整型、字符串、元祖、列表、字典,布尔类型等,而Spark的数据类型只有RDD这一种,在Spark里,对数据的所有操作,基本上就是围绕RDD来的,譬如创建、转换、求值等等。所有RDD的转换都是lazy(惰性求值)的,RDD的转换操作会生成新的RDD,新的RDD的数据依赖于原来的RDD的数据,每个RDD又包含多个分区。那么一段程序实际上就构造了一个由相互依赖的多个RDD组成的有向无环图(DAG)。并通过在RDD上执行动作将这个有向无环图作为一个Job提交给Spark执行。理解RDD后可以避免以后走很多弯路。关于RDD的特点,可以搜到很多资料,其实我们只需要理解两点就可以了:
  1.不可变
      2.分布式
 
     有人会觉得很奇怪,如果RDD不可变,那么在进行数据操作的时候,怎么改变它的值,怎么进行计算呢?其实RDD支持两种操作
     1.Tansformation(转化操作):返回值还是一个RDD
     2.Action(行动操作):返回值不是一个RDD
 
     第一种Transformation是返回一个新的RDD,如map(),filter()等。这种操作是lazy(惰性)的,即从一个RDD转换生成另一个RDD的操作不是马上执行,只是记录下来,只有等到有Action操作是才会真正启动计算,将生成的新RDD写到内存或hdfs里,不会对原有的RDD的值进行改变。而Action操作才会实际触发Spark计算,对RDD计算出一个结果,并把结果返回到内存或hdfs中,如count(),first()等。
 
     通俗点理解的话,就是假设你写了一堆程序,里面对数据进行了多次转换,这个时候实际上没有计算,就只是放着这里。在最后出结果的时候会用到Action操作,这个时候Action会执行与之相关的转换操作,运算速度会非常快(一是Action不一定需要调用所有的transformation操作,二是只有在最后一步才会计算相关的transformation操作)。如果Transformation没有lazy性质的话,每转换一次就要计算一次,最后Action操作的时候还要计算一次,会非常耗内存,也会极大降低计算速度。
 
     还有一种情况,如果我们想多次使用同一个RDD,每次都对RDD进行Action操作的话,会极大的消耗Spark的内存,这种情况下,我们可以使用RDD.persist()把这个RDD缓存下来,在内存不足时,可以存储到磁盘(disk)里。在Python中,储存的对象永远是通过Pickle库序列化过的,所以社不设置序列化级别不会产生影响。
 
     RDD的性质和操作方式讲完了,现在来说说怎么创建RDD,有两种方式
     1.读取一个外部数据集
     2.在内存中对一个集合进行并行化(parallelize)
 
     第二种方式相对来说更简单,你可以直接在shell里快速创建RDD,举个例子:
1 A = [1,2,3,4,5]
2 lines = sc.parallelize(A)
3 #另一种方式
4 lines = sc.parallelize([1,2,3,4,5])
  
  但是这种方式并不是很好,因为你需要把你的整个数据集放在内存里,如果数据量比较大,会很占内存。所以,可以在测试的时候用这种方式,简单快速。
     
  读取外部数据及时需要用到SparkContext.textFile()
 
 1 lines = sc.textFile("README.md") 
 
  RDD的操作命令很多,包括map(),filter()等Transformation操作以及reduce(),fold(),aggregate()等Action操作。
  • 常见的Transformation操作:

  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.intersection( )的性能比union( )差很多,因为它需要数据混洗来发现共同数据

2.substract( )也需要数据混洗
  • 常见的Action操作:

  

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()等,限于篇幅,就不一一表述了。

  最后来讲讲如何向Spark传递函数
  两种方式:
  1.简单的函数:lambda表达式。
     适合比较短的函数,不支持多语句函数和无返回值的语句。
  2.def函数
     会将整个对象传递过去,但是最好不要传递一个带字段引用的函数。如果你传递的对象是某个对象的成员,或者在某个函数中引用了一个整个字段,会报错。举个例子:
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的特性以及一些简单的命令,比较简单。后面三章主要讲了键值对操作、数据的读取和保存以及累加器、广播变量等,下周再更新。

 
原文转自:http://www.cnblogs.com/charlotte77/p/5412709.html

Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令的更多相关文章

  1. 【原】Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令

    <Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...

  2. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  3. 【原】Learning Spark (Python版) 学习笔记(四)----Spark Sreaming与MLlib机器学习

    本来这篇是准备5.15更的,但是上周一直在忙签证和工作的事,没时间就推迟了,现在终于有时间来写写Learning Spark最后一部分内容了. 第10-11 章主要讲的是Spark Streaming ...

  4. 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性

    本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...

  5. 【数据结构与算法Python版学习笔记】图——基本概念及相关术语

    概念 图Graph是比树更为一般的结构, 也是由节点和边构成 实际上树是一种具有特殊性质的图 图可以用来表示现实世界中很多有意思的事物,包括道路系统.城市之间的航班.互联网的连接,甚至是计算机专业的一 ...

  6. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  7. 【数据结构与算法Python版学习笔记】算法分析

    什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平 ...

  8. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  9. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

随机推荐

  1. Mybatis笔记3

    Mybatis映射文件的SQL深入 (Mybatis今天学的不多,看了半天的mysql必知必会) 动态sql语句-if语句,查询一个用户的时候,有可能根据地址查询,用户名查询,性别查询等,所以需要动态 ...

  2. 自定义注解扩展springMvc的validation注解

    文章目录 前言 自定义校验注解 使用 后记 前言 我们都知道 springMvc 的检验框架使用的是 hibernate 的 validator ,检验数据,是有那么一点小爽快: 但是,validat ...

  3. WUSTOJ 1305: 最短路(Java)

    题目链接:

  4. Windows服务器修改远程桌面默认端口

    一.打开注册表(通过开始菜单处输入命令输入 regedit回车即可打开注册表信息,或者Win键+R键打开输入框后输入regedit后回车) 二.打开注册表后,在左侧属性菜单进入下列路径“HKEY_LO ...

  5. P1777 帮助_NOI导刊2010提高(03)

    也许更好的阅读体验 \(\mathcal{Description}\) Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30 ...

  6. git 如何取消add操作

    可以直接使用命令    git reset HEAD 这个是整体回到上次一次操作 绿字变红字(撤销add) 如果是某个文件回滚到上一次操作:  git reset HEAD  文件名 红字变无 (撤销 ...

  7. 微信小程序DEMO——面包旅行的代码

    API 集合在一起写了一个页面,并导出, const apiURL = 'http://xxx.xxxx.com'; const trip = { hot(data,callback){ wx.req ...

  8. Windows Mobile设备中心不能正常运行

    1.开始-->运行,输入services.msc回车 2.在打开的服务界面中,找到“基于Windows Mobile 2003的连接设备” 3.打开的属性 ,找到登录项,登录身份选择“本地系统账 ...

  9. windows环境下如何搭建Consul+Ocelot

    下面的是markdown格式的文档,懒得排版了,有兴趣的话可以去github上看,有源码 Github:https://github.com/yuchengao0721/Consul-Ocelot.g ...

  10. 【转载】 C#使用Union方法求两个List集合的并集数据

    在C#语言的编程开发中,有时候需要对List集合数据进行运算,如对两个List集合进行交集运算或者并集运算,其中针对2个List集合的并集运算,可以使用Union方法来快速实现,Union方法的调用格 ...