pyspark_1_理论篇(RDD基础)

跟着Leo学习PySpark

chapter1——rdd的基础编程指南

一、准备工作

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来实现。但这个模块里面也有很多有用的机器学习算法,我们可以适当的把玩一下。

你可能感兴趣的:(pyspark_1_理论篇(RDD基础))