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

本文是《Learning Spark》一书的学习笔记,主要介绍Spark的RDD(弹性分布式数据集)基本概念,强调其不可变性和分布式特性。文中详细解释了RDD的转换(Transformation)和行动(Action)操作,以及如何创建和操作RDD,包括map、filter、flatMap、distinct、union等。此外,还讨论了如何向Spark传递函数,如使用lambda和def定义的函数,并给出了注意事项。
摘要由CSDN通过智能技术生成

感谢关注天善智能,走好数据之路↑↑↑

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!

对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。


《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().

用一个图可以很清楚的理解:

伪集合操作:

distinct( )、union( )、intersection( )、subtract( )

distinct( ):去重

union( ):两个RDD的并集

intersection( ):两个RDD的交集

subtract( ):两个RDD的补集

cartesian( ):两个RDD的笛卡尔积(可以应用于计算相似度中,如计算各用户对各种产品的预期兴趣程度)

注:

1.intersection( )的性能比union( )差很多,因为它需要数据混洗来发现共同数据

2.substract( )也需要数据混洗


常见的Action操作:

distinct( )、union( )、intersection( )、subtract( )

distinct( ):去重

union( ):两个RDD的并集

intersection( ):两个RDD的交集

subtract( ):两个RDD的补集

cartesian( ):两个RDD的笛卡尔积(可以应用于计算相似度中,如计算各用户对各种产品的预期兴趣程度)

注:

1.intersection( )的性能比union( )差很多,因为它需要数据混洗来发现共同数据

2.substract( )也需要数据混洗

RDD还有很多其他的操作命令,譬如collect(),count(),take(),top(),countByValue(),foreach()等,限于篇幅,就不一一表述了。


最后来讲讲如何向Spark传递函数

两种方式:

1.简单的函数:lambda表达式。

   适合比较短的函数,不支持多语句函数和无返回值的语句。

2.def函数

   会将整个对象传递过去,但是最好不要传递一个带字段引用的函数。如果你传递的对象是某个对象的成员,或者在某个函数中引用了一个整个字段,会报错。举个例子:

class MyClass(object):

  def __init__(self):

    self.field = “Hello”

  def doStuff(self, rdd):

    #报错:因为在self.field中引用了整个self

    return rdd.map(lambda s: self.field + x)


 解决方法:直接把你需要的字段拿出来放到一个局部变量里,然后传递这个局部变量就可以了。

class MyClass(object):

  def __init__(self):

    self.field = “Hello”

  def doStuff(self, rdd):

    #将需要的字段提取到局部变量中即可

    field = self.field

    return rdd.map(lambda s: field + x)

前面三章讲了Spark的基本概念和RDD的特性以及一些简单的命令,比较简单。后面三章主要讲了键值对操作、数据的读取和保存以及累加器、广播变量等。


老师介绍:胡晓曼老师(Charlotte),高级算法工程师 ,博客专家;

擅长用通俗易懂的方式讲解深度学习和机器学习算法,熟悉Tensorflow,PaddlePaddle等深度学习框架,负责过多个机器学习落地项目,如垃圾评论自动过滤,用户分级精准营销,分布式深度学习平台搭建等,都取了的不错的效果。

出处:https://www.hellobi.com/u/CharlotteDataMining/articles

三个月教你从零入门人工智能!| 深度学习精华实践课程

https://edu.hellobi.com/course/268

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值