Learning Spark (Python版) 学习笔记(一)

作者: 天善智能 | 来源:发表于2018-04-18 16:27 被阅读38次

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

    欢迎关注天善智能,我们是专注于商业智能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

    相关文章

      网友评论

      本文标题:Learning Spark (Python版) 学习笔记(一)

      本文链接:https://www.haomeiwen.com/subject/sdzvkftx.html