# leo_pyspark_learning **Repository Path**: leojie/leo_pyspark_learning ## Basic Information - **Project Name**: leo_pyspark_learning - **Description**: 跟着leo学习pyspark - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2019-12-05 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 一、准备工作 #### 1. 背景介绍 Spark是用scala编程语言实现的,为了使Spark支持Python,Apache Spark社区发布了一个工具PySpark。使用PySpark,您可以使用Python编程 语言处理RDD。方便地进行数据处理与数据分析。有关Spark更深层次的理论,本系列课程不会过深涉及。这里会由浅入深,全面且细致的为大家讲解各种 PySpark API的用法,大量的示例,以及来自一线大厂的PySpark的使用经验与踩坑记录,无论您是菜鸟还是老鸟,相信您从中都会吸取大量精华。 #### 2. 软件版本 - PySpark(Spark) 2.4.3,本系列课程基于目前最新版本的Spark,而且Spark2.x也早已被大量用于生产环境中。 - Python2.7.5 Spark 2.4.3适用于Python 2.7+或Python 3.4+。但在Spark 2.2.0中删除了对Python 2.6的支持。虽然说截至20年,Python2将停止维护,但当前Python2依旧应用非常广泛,个人认为其生态比Python3的生态要好。所以大家可以放心使用。其实对于spark的操作来说,Python2与Python3的差异并不明显。 #### 3. 开发环境准备 - 本课程代码RDD,spark-sql、DataFrame的操作将使用Jupyter Notebook编写。关于jupyter的使用,网上有大量资料可供参考。 - 当然你也可以选择您喜欢的IDE,这里笔者推荐PyCharam - 作为练习阶段使用,您可以不用准备集群环境,或本地伪分布式的环境,很多API的测试,本地一样可以执行。后期将为大家讲解集群环境下的PySpark运行示例,以及线上作业提交,资源调配、作业监控等。 - 操作系统,笔者的开发环境为macOS - pycharm新建一个空项目,pip install pyspark 安装pyspark的模块,然后大家就可以愉快地进行开发了。 ### 二、Spark中的一些重要概念 #### 1. 什么是RDD Spark是围绕RDD这个核心概念来展开的,RDD,官方给出的解释是,弹性分布式数据集,是可以并行操作的容错集合。它是Spark的基础数据结构,表现形式为不可变的分区元素的集合,且可以在集群中并行操作。我们可以从现有并行化驱动程序中的集合,或引用外部存储系统(例如:文件系统、HDFS、HBase等数据源)来创建一个RDD。 说白了,RDD的数据的一种抽象、映射。Spark要想处理我们需要处理的数据集,数据集必须先转换成RDD这种数据结构,然后经过一系列转换操作,最终得到我们想要的结果。 #### 2. RDD的特性 - 容错性。在节点故障导致丢失或分区损坏时,可以重新计算数据。 - 被分区的,数据被分为多个分区,每个分区分布在集群中的不同节点上,从而让RDD中的数据可以被并行操作 - 可序列化,RDD可以cache到内存中,可以避免昂贵的IO操作,只有当内存资源不够的时候,才会把数据写入磁盘。 #### 3. Spark的编程模型 RDD被表示为对象——>通过对象上的方法调用实现对RDD的转换操作(Transformation)——>输出结果或向存储系统中保存数据(只有遇到Action算子,才会执行RDD的计算,也即懒执行) #### 4. Spark中的算子分类 - Transformation(转换): 根据数据集创建一个新的数据集,计算后返回一个新的RDD,例如:map。 - Action(动作):对RDD结果计算后返回一个数值value给驱动程序。例如:collect算子将数据集的所有元素收集完后返回给驱动程序。 - 控制:Spark中控制算子也是懒执行的,需要Action算子触发才能执行,主要是为了对数据进行缓存。。当有Action算子出现时,他才会真正的执行Spark中控制算子也是懒执行的,需要Action算子触发才能执行,主要是为了对数据进行缓存,当有Action算子出现时,他才会真正的执行。例如:创建了一个视图,他并不是把查询好的数据放入视图了,而是当你需要这些数据时,查看视图时,他才执行定义视图时候的SQL语句。 spark RDD操作基础系列课程将带着大家一一学习这些算子的使用。 #### 5. pyspark的模块介绍 ##### pyspark模块 这个模块是最基础的模块,里面实现了最基础的编写Spark作业的API。这个模块里面有以下内容: - SparkContext:它是编写Spark程序的主入口 - RDD:分布式弹性数据集,是Spark内部中最重要的抽象 - Broadcast:在各个任务中重复使用的广播变量 - SparkConf:一个配置对象,用来对Spark中例如资源、内核个数、提交模式等的配置 - SparkFiles:文件访问API - StorageLevel:提供细粒度的对于数据的缓存、持久化级别 - TaskContext:实验性质API,用于获取运行中任务的上下文信息 ##### pyspark.sql模块 这个模块是架构在RDD之上的高级模块,提供了SQL的支持,它包括以下内容: - SparkSession:SparkSQL的主入口,其内部调用的仍然是SparkContext - DataFrame:分布式的结构化数据集,最终的计算其实仍然转换为RDD的计算 - Column:DataFrame中的列 - Row:DataFrame中的行 - GroupedData:这里提供聚合数据的一些方法 - DataFrameNaFunctions:处理缺失数据的方法 - DataFrameStatFunctions:提供统计数据的一些方法 - functions:内建的可用于DataFrame的方法 - types:可用的数据类型 - Window:提供窗口函数的支持 ##### pyspark.streaming 这个模块主要是用来处理流数据,从外部的消息中间件如kafka,flume或者直接从网络接收数据,来进行实时的流数据处理。其内部会将接收到的数据转换为DStream,DStream的内部实际上就是RDD。pyspark.streaming对流数据的支持还不是很完善,不如原生的Scala语言和Java语言。 ##### pyspark.ml 这个模块主要是做机器学习的,里面实现了很多机器学习算法,包括分类、回归、聚类、推荐。这个的内容我们会囊括最主要的机器学习算法。pyspark.ml这个模块现已经成为主要的机器学习模块,其内部实现是基于DataFrame数据框。 ##### pyspark.mllib 这个模块也是做机器学习的,但是这个模块底层使用的RDD,RDD在性能上优化的余地较少,因此现在最新的机器学习算法都是用基于DataFrame的API来实现。但这个模块里面也有很多有用的机器学习算法,我们可以适当的把玩一下。