目录
1. Spark概述
Spark是一个开源的、大规模的、快速的数据处理引擎,专为大规模数据处理而设计。它提供了一个统一的编程模型来处理批处理、交互式查询、实时流处理和图计算等多种类型的数据处理任务。
2. 主要特点
- 快速:Spark使用基于内存的计算模型,能够比传统的基于磁盘的MapReduce框架(如Hadoop)快很多。
- 易用性:提供了高级API,支持Scala、Java、Python和R等多种编程语言。
- 通用性:Spark提供了一个统一的编程模型来处理各种类型的数据处理任务。
- 容错性:Spark使用弹性分布式数据集(RDD)来存储数据,并支持容错和恢复。
- 伸缩性:Spark可以在大规模集群上运行,并且可以自动管理资源。
- 基于内存计算:Spark将数据存储在内存中,避免了磁盘I/O的瓶颈,从而大大提高了数据处理速度。
- 通用性:Spark支持多种数据处理模型,包括批处理、流处理、机器学习和图计算等,可以满足不同类型的数据处理需求。
- 高容错性:Spark具有强大的容错能力,能够自动恢复失败的任务,保证数据处理的稳定性和可靠性。
- 丰富的生态系统:Spark生态系统包含多个组件,如Spark SQL、Spark Streaming、Spark MLlib和GraphX等,可以方便地进行数据分析、数据挖掘、机器学习和图计算等任务。
3. 主要功能
- Spark Core:提供了Spark的基本功能,包括任务调度、内存管理、错误恢复等。
- Spark SQL:提供了SQL接口和数据框架,用于处理结构化数据。
- Spark Streaming:用于处理实时数据流,支持从Kafka、Flume等数据源接收数据。
- MLlib:提供了大量的机器学习算法和工具,用于构建机器学习应用。
- GraphX:用于图计算和图分析,提供了丰富的图算法和图操作。
4. 应用场景
- 数据分析与数据挖掘:用于处理和分析大规模数据集,提取有价值的信息。
- 实时数据分析:利用Spark Streaming处理实时数据流,实现实时数据分析。
- 机器学习:利用MLlib构建各种机器学习模型,如分类、聚类、回归等。
- 图计算:用于社交网络分析、推荐系统、生物信息学等领域。
- ETL(Extract, Transform, Load):用于数据清洗、转换和加载,构建数据仓库或数据湖。
5. 优缺点
- 优点:
- 速度快:基于内存的计算模型比传统的基于磁盘的模型快。
- 易用性:提供了丰富的API和多种编程语言支持。
- 通用性:支持多种类型的数据处理任务。
- 伸缩性:可以运行在大规模集群上。
- 缺点:
- 学习曲线陡峭:对于初学者来说,Spark的编程模型可能比较复杂。
- 内存消耗大:由于基于内存的计算模型,Spark在处理大规模数据集时可能会消耗大量内存。
- 对实时性要求较高:虽然Spark Streaming支持实时数据处理,但对于毫秒级的实时性要求可能不够。
6. 生态系统
Spark生态系统(也称为BDAS)包括多个组件,它们共同构成了一个强大的大数据处理平台。这些组件包括:
- Spark Core:Spark的基本框架和核心功能。
- Spark SQL:用于处理结构化数据。
- Spark Streaming:用于处理实时数据流。
- MLlib:提供了大量的机器学习算法和工具。
- GraphX:用于图计算和图分析。
- SparkR:提供了R语言的接口。
- BlinkDB:一个近似查询引擎,用于在大数据集上执行快速交互式查询。
- Tachyon:一个内存存储系统,用于提供跨集群的可靠内存级数据共享。
Scala基础
一、Scala简介
Scala源自Java,构建在JVM之上,与Java兼容、互通。
Scala的优势:
1.多范式编程:
(1)面向对象编程:
每个值都是对象;
对象的数据类型和行为由类(Class)和特征(Trait,类似于interface)描述;
利用特征实现混入式多重继承。
(2)函数式编程:
每个函数都是一个值;
支持高阶函数、柯里化(currying)、样例类(case class)及模式匹配......
2.Scala是静态语言,表达能力强,代码精简
3.Spark采用Scala语言设计,提供的API更加优雅,基于JVM的语言更融入Hadoop生态圈。
4.扩展性:隐式类、字符串差值
二、Scala变量(var)与常量(val)
变量:
赋值后可以改变,生命周期中可以被多次赋值。
var 变量名称:类型=xxx
一般无需显示指定类型,Scala编译器会自动推断出类型
常量:
赋值后不可变,类似于Java中的final变量
val 常量名称:类型=xxx
三、Scala数据类型
Scala与Java有相同的数据类型,但是Scala的数据类型首字母全部大写
Byte、Short、Int、Long、Float、Double、Char、Boolean、String
1)Scala中一切数据都是对象,都是Any的子类;
2)Scala中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象;
3)Scala数据类型仍然遵守,低精度的值类型向高精度值类型,自动转换(隐式转换);
4)Scala中的StringOps是对Java中的String增强;
5)Unit:对应Java中的void,用于方法返回值的位置,表示方法没有返回值。Unit是 一个数据类型,只有一个对象就是()。Void不是数据类型,只是一个关键字;
6)Null是一个类型,只有一个对象就是null。它是所有引用类型(AnyRef)的子类;
7)Nothing,是所有数据类型的子类,主要用在一个函数没有明确返回值时使用,因为这样可以把抛出的返回值,返回给任何的变量或者函数。
RDD方法归纳
1.使用map()方法转换数据
map()方法是一种基础的RDD转换操作,可以对 RDD 中的每一个数据元素通过某种函数进行转换并返回新的RDD。mapO方法是懒操作,不会立即进行计算。
转换操作是创建RDD的第二种方法,通过转换已有RDD生成新的RDD。因为RDD是一个不可变的集合,所以如果对 RDD 数据进行了某种转换,那么会生成一个新的 RDD。
2.使用 sortBy()方法进行排序
sortBy0方法用于对标准RDD 进行排序,有3个可输人参数,说明如下。
(1)第1个参数是一个函数f:(T)=>K,左边是要被排序对象中的每一个元素,右边返回的值是元素中要进行排序的值。
(2)第2个参数是 ascending,决定排序后 RDD 中的元素是升序的还是降序的,默认是 true,即升序排序,如果需要降序排序则需要将参数的值设置为 false。
(3)第3个参数是numPartitions,决定排序后的RDD 的分区个数,默认排序后的分区个数和排序之前的分区个数相等,即 this.partitions.size。
第一个参数是必须输人的,而后面的两个参数可以不输人。例如,通过一个存放了 3个二元组的列表创建一个 RDD,对元组的第二个值进行降序排序,分区个数设置为1,代码如下
3.使用collect()方法查询数据
collect:直接调用 collect 返回该 RDD 中的所有元素,返回类型是一个 Array[T数组,这是较为常用的一种方式。
4.使用flatMap()方法转换数据
flatMap()方法将函数参数应用于RDD之中的每一个元素,将返回的迭代器(如数组、列表等)中的所有元素构成新的RDD。
使用flatMap()方法时先进行map(映射)再进行flat(扁平化)操作,数据会先经过跟map一样的操作,为每一条输入返回一个迭代器(可迭代的数据类型),然后将所得到的不同级别的迭代器中的元素全部当成同级别的元素,返回一个元素级别全部相同的RDD。这个转换操作通常用来切分单词。
5.使用take()方法查询某几个值
take(N)方法用于获取RDD的前N个元素,返回数据为数组。take()与collect()方法的原理相似,collect()方法用于获取全部数据,take()方法获取指定个数的数据。
6.使用union()方法合并多个RDD
union()方法是一种转换操作,用于将两个RDD合并成一个,不进行去重操作,而且两个RDD中每个元素中的值的个数、数据类型需要保持一致。
7.使用filter()方法进行过滤
filter()方法是一种转换操作,用于过滤RDD中的元素。
8.使用distinct()方法进行去重
distinct()方法是一种转换操作,用于RDD的数据去重,去除两个完全相同的元素,没有参数。创建一个带有重复数据的RDD,并使用distinct()方法去重。
Spark SQL——结构化数据文件处理
DataFrame简介
DataFrame可以看作是分布式的Row对象的集合,在二维表数据集的每一列都带有名称和类型,这就是Schema元信息,这使得Spark框架可获取更多数据结构信息,从而对在DataFrame背后的数据源以及作用于DataFrame之上数据变换进行针对性的优化,最终达到提升计算效率。
DataFrame 是 Spark SQL 提供的一个分布式数据集,它是带有 Schema 元信息的 DataSet,可以看作是关系数据库中的一个表。DataFrame 可以从多种源构建,如结构化数据文件、Hive 表、外部数据库或现有的 RDD。它支持 Spark SQL 查询和 DataFrame API,可以方便地进行数据处理和转换。
DataFrame的创建
创建DataFrame的两种基本方式:
已存在的RDD调用toDF()方法转换得到DataFrame
通过Spark读取数据源直接创建DataFrame