目录
数组常用方法
列表操作常用方法
Scala中常用的查看列表元素的方法有head、init、last、tail和take()。
合并两个列表还可以使用concat()方法。
集合操作常用方法
map()方法
foreach()方法
filter()方法
flatten()方法
groupBy()方法
编辑
从内存中读取数据创建RDD
parallelize()方法
makeRDD()方法
map()方法
sortBy()方法
collect()方法
collect()方法有以下两种操作方式。
take(N)方法
使用filter()方法进行过滤
使用distinct()方法进行去重
Spark中的集合操作常用方法(转换操作)
cartesian()方法
使用键值对RDD的keys和values方法
使用键值对RDD的reduceByKey()方法
1. parallelize()
2. makeRDD()
从外部存储系统中读取数据创建RDD
使用map()方法转换数据
使用sortBy()方法进行排序
使用collect()方法查询数据
编辑 使用flatMap()方法转换数据
使用take()方法查询某几个值
使用union()方法合并多个RDD
使用filter()方法进行过滤
使用distinct()方法进行去重
使用简单的集合操作
intersection()方法
subtract()方法
cartesian()方法
创建键值对RDD
使用键值对RDD的keys和values方法
编辑使用键值对RDD的reduceByKey()方法
使用键值对RDD的groupByKey()方法
使用join()方法连接两个RDD
(1)join()方法
(2)rightOuterJoin()方法
(3)leftOuterJoin()方法
(4)fullOuterJoin()方法
查看DataFrame数据
1. printSchema:输出数据模式
2. show():查看数据
show(numRows:Int)查看前n行记录
编辑 3.first()/head()/take()/takeAsList():获取若干条记录
4.collect()/collectAsList():获取所有数据
将DataFrame注册成为临时表,然后通过SQL语句进行查询
直接在DataFrame对象上进行查询,DataFrame提供了很多查询的方法
1.where()/filter()方法
(1)where()方法
(2)filter()方法
编辑2.select()/selectExpr()/col()/apply()方法
数组常用方法
方法 | 描述 |
length | 返回数组的长度 |
head | 查看数组的第一个元素 |
tail | 查看数组中除了第一个元素外的其他元素 |
isEmpty | 判断数组是否为空 |
contains(x) | 判断数组是否包含元素x |
数组是Scala中常用的一种数据结构,数组是一种存储了相同类型元素的固定大小的顺序集合。Scala定义一个数组的语法格式如下。
# 第1种方式
var arr: Array[String] = new Array[String](num)
# 第2种方式
var arr:Array[String] = Array(元素1,元素2,…)
Scala可以使用range()方法创建区间数组。
使用range()方法前同样需要先通过命令“import Array._”导入包。
列表操作常用方法
方法 | 描述 |
def head: A | 获取列表的第一个元素 |
def init:List[A] | 返回所有元素,除了最后一个元素 |
def last:A | 获取列表的最后一个元素 |
def tail:List[A] | 返回所有元素,除了第一个元素 |
def :::(prefix: List[A]): List[A] | 在列表开头添加指定列表的元素 |
def take(n: Int): List[A] | 获取列表前n个元素 |
def contains(elem: Any): Boolean | 判断列表是否包含指定元素 |
Scala中常用的查看列表元素的方法有head、init、last、tail和take()。
•head:查看列表的第一个元素。
•tail:查看第一个元素之后的其余元素。
•last:查看列表的最后一个元素。
•Init:查看除最后一个元素外的所有元素。
•take():查看列表前n个元素。
合并两个列表还可以使用concat()方法。
用户可以使用contains()方法判断列表中是否包含某个元素,若列表中存在指定的元素则返回true,否则返回false。
Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的。
集合操作常用方法
方法 | 描述 |
def head: A | 获取集合的第一个元素 |
def init:Set[A] | 返回所有元素,除了最后一个 |
def last:A | 获取集合的最后一个元素 |
def tail:Set[A] | 返回所有元素,除了第一个 |
def ++(elems: A): Set[A] | 合并两个集合 |
def take(n: Int): List[A] | 获取列表前n个元素 |
def contains(elem: Any): Boolean | 判断集合中是否包含指定元素 |
Scala合并两个列表时使用的是:::()或concat()方法,而合并两个集合使用的是++()方法。
map()方法
可通过一个函数重新计算列表中的所有元素,并且返回一个包含相同数目元素的新列表。
foreach()方法
和map()方法类似,但是foreach()方法没有返回值,只用于对参数的结果进行输出。
filter()方法
可以移除传入函数的返回值为false的元素。
flatten()方法
可以将嵌套的结构展开,即flatten()方法可以将一个二维的列表展开成一个一维的列表。
flatMap()方法
结合了map()方法和flatten()方法的功能,接收一个可以处理嵌套列表的函数,再对返回结果进行连接。
groupBy()方法
可对集合中的元素进行分组操作,返回的结果是一个映射。
groupBy()方法
从原始数据中抽取4条数据,并存放至列表phone中,使用groupBy()方法根据归属地对列表中的元素进行分组。
从内存中读取数据创建RDD
parallelize()方法
有两个输入参数,说明如下。
•要转化的集合,必须是Seq集合。Seq表示序列,指的是一类具有一定长度的、可迭代访问的对象,其中每个数据元素均带有一个从0开始的、固定的索引。
•分区数。若不设分区数,则RDD的分区数默认为该程序分配到的资源的CPU核心数。
makeRDD()方法
有两种使用方式。
•第一种方式的使用与parallelize()方法一致;
•第二种方式是通过接收一个是Seq[(T,Seq[String])]参数类型创建RDD。
第二种方式生成的RDD中保存的是T的值,Seq[String]部分的数据会按照Seq[(T,Seq[String])]的顺序存放到各个分区中,一个Seq[String]对应存放至一个分区,并为数据提供位置信息,通过preferredLocations()方法可以根据位置信息查看每一个分区的值。调用makeRDD()时不可以直接指定RDD的分区个数,分区的个数与Seq[String]参数的个数是保持一致的。
map()方法
是一种基础的RDD转换操作,可以对RDD中的每一个数据元素通过某种函数进行转换并返回新的RDD。
map()方法是转换操作,不会立即进行计算。
转换操作是创建RDD的第二种方法,通过转换已有RDD生成新的RDD。因为RDD是一个不可变的集合,所以如果对RDD数据进行了某种转换,那么会生成一个新的RDD。
sortBy()方法
用于对标准RDD进行排序,有3个可输入参数,说明如下。
•第1个参数是一个函数f:(T) => K,左边是要被排序对象中的每一个元素,右边返回的值是元素中要进行排序的值。
•第2个参数是ascending,决定排序后RDD中的元素是升序的还是降序的,默认是true,即升序排序,如果需要降序排序那么需要将参数的值设置为false。
•第3个参数是numPartitions,决定排序后的RDD的分区个数,默认排序后的分区个数和排序之前的分区个数相等,即this.partitions.size。
第一个参数是必须输入的,而后面的两个参数可以不输入。
collect()方法
是一种行动操作,可以将RDD中所有元素转换成数组并返回到Driver端,适用于返回处理后的少量数据。
因为需要从集群各个节点收集数据到本地,经过网络传输,并且加载到Driver内存中,所以如果数据量比较大,会给网络传输造成很大的压力。
因此,数据量较大时,尽量不使用collect()方法,否则可能导致Driver端出现内存溢出问题。
collect()方法有以下两种操作方式。
•collect:直接调用collect返回该RDD中的所有元素,返回类型是一个Array[T]数组。
•collect[U: ClassTag](f: PartialFunction[T, U]):RDD[U]。这种方式需要提供一个标准的偏函数,将元素保存至一个RDD中。首先定义一个函数one,用于将collect方法得到的数组中数值为1的值替换为“one”,将其他值替换为“other”。
take(N)方法
用于获取RDD的前N个元素,返回数据为数组。
take()与collect()方法的原理相似,collect()方法用于获取全部数据,take()方法获取指定个数的数据。
获取RDD的前5个元素
使用union()方法合并多个RDD
union()方法是一种转换操作,用于将两个RDD合并成一个,不进行去重操作,而且两个RDD中每个元素中的值的个数、数据类型需要保持一致。
使用union()方法合并两个RDD
使用filter()方法进行过滤
filter()方法是一种转换操作,用于过滤RDD中的元素。
filter()方法需要一个参数,这个参数是一个用于过滤的函数,该函数的返回值为Boolean类型。
filter()方法将返回值为true的元素保留,将返回值为false的元素过滤掉,最后返回一个存储符合过滤条件的所有元素的新RDD。
创建一个RDD,并且过滤掉每个元组第二个值小于等于1的元素。
使用distinct()方法进行去重
distinct()方法是一种转换操作,用于RDD的数据去重,去除两个完全相同的元素,没有参数。
创建一个带有重复数据的RDD,并使用distinct()方法去重。
Spark中的集合操作常用方法(转换操作)
intersection()方法
intersection()方法用于求出两个RDD的共同元素,即找出两个RDD的交集,参数是另一个RDD,先后顺序与结果无关。
创建两个RDD,其中有相同的元素,通过intersection()方法求出两个RDD的交集。
subtract()方法
subtract()方法用于将前一个RDD中在后一个RDD出现的元素删除,可以认为是求补集的操作,返回值为前一个RDD去除与后一个RDD相同元素后的剩余值所组成的新的RDD。两个RDD的顺序会影响结果。
创建两个RDD,分别为rdd1和rdd2,包含相同元素和不同元素,通过subtract()方法求rdd1和rdd2彼此的补集。
cartesian()方法
cartesian()方法可将两个集合的元素两两组合成一组,即求笛卡儿积。
创建两个RDD,分别有4个元素,通过cartesian()方法求两个RDD的笛卡儿积。
使用键值对RDD的keys和values方法
使用键值对RDD的reduceByKey()方法
当数据集以键值对形式展现时,合并统计键相同的值是很常用的操作。
reduceByKey()方法用于合并具有相同键的值,作用对象是键值对,并且只对每个键的值进行处理,当RDD中有多个键相同的键值对时,则会对每个键对应的值进行处理。
reduceByKey()方法需要接收一个输入函数,键值对RDD相同键的值会根据函数进行合并并且创建一个新的RDD作为返回结果。
在进行处理时,reduceByKey()方法将相同键的前两个值传给输入函数,产生一个新的返回值,新产生的返回值与RDD中相同键的下一个值组成两个元素,再传给输入函数,直到最后每个键只有一个对应的值为止。reduceByKey()方法不是一种行动操作,而是一种转换操作。
使用键值对RDD的groupByKey()方法
groupByKey()方法用于对具有相同键的值进行分组,可以对同一组的数据进行计数、求和等操作。
对于一个由类型K的键和类型V的值组成的RDD,通过groupByKey()方法得到的RDD类型是[K,Iterable[V]]。
1. parallelize()
parallelize()方法有两个输入参数,说明如下。
2. makeRDD()
makeRDD()方法有两种使用方式。
第二种方式生成的RDD中保存的是T的值,Seq[String]部分的数据会按照Seq[(T,Seq[String])]的顺序存放到各个分区中,一个Seq[String]对应存放至一个分区,并为数据提供位置信息,通过preferredLocations()方法可以根据位置信息查看每一个分区的值。调用makeRDD()时不可以直接指定RDD的分区个数,分区的个数与Seq[String]参数的个数是保持一致的。
从外部存储系统中读取数据创建RDD
从外部存储系统中读取数据创建RDD是指直接读取存放在文件系统中的数据文件创建RDD。
从内存中读取数据创建RDD的方法常用于测试,从外部存储系统中读取数据创建RDD才是用于实践操作的常用方法。
从外部存储系统中读取数据创建RDD可以有很多种数据来源,可通过SparkContext对象的textFile()方法读取数据集,该方法支持多种类型的数据集,如目录、文本文件、压缩文件和通配符匹配的文件等,并且允许设定分区个数。
使用map()方法转换数据
map()方法是一种基础的RDD转换操作,可以对RDD中的每一个数据元素通过某种函数进行转换并返回新的RDD。
map()方法是转换操作,不会立即进行计算。
转换操作是创建RDD的第二种方法,通过转换已有RDD生成新的RDD。因为RDD是一个不可变的集合,所以如果对RDD数据进行了某种转换,那么会生成一个新的RDD。
使用sortBy()方法进行排序
sortBy()方法用于对标准RDD进行排序,有3个可输入参数,说明如下。
第一个参数是必须输入的,而后面的两个参数可以不输入。
使用collect()方法查询数据
collect()方法是一种行动操作,可以将RDD中所有元素转换成数组并返回到Driver端,适用于返回处理后的少量数据。
因为需要从集群各个节点收集数据到本地,经过网络传输,并且加载到Driver内存中,所以如果数据量比较大,会给网络传输造成很大的压力。
因此,数据量较大时,尽量不使用collect()方法,否则可能导致Driver端出现内存溢出问题。
collect()方法有以下两种操作方式。
使用flatMap()方法转换数据
flatMap()方法将函数参数应用于RDD之中的每一个元素,将返回的迭代器(如数组、列表等)中的所有元素构成新的RDD。
使用flatMap()方法时先进行map(映射)再进行flat(扁平化)操作,数据会先经过跟map一样的操作,为每一条输入返回一个迭代器(可迭代的数据类型),然后将所得到的不同级别的迭代器中的元素全部当成同级别的元素,返回一个元素级别全部相同的RDD。
这个转换操作通常用来切分单词。
使用take()方法查询某几个值
take(N)方法用于获取RDD的前N个元素,返回数据为数组。
take()与collect()方法的原理相似,collect()方法用于获取全部数据,take()方法获取指定个数的数据。
获取RDD的前5个元素
使用union()方法合并多个RDD
union()方法是一种转换操作,用于将两个RDD合并成一个,不进行去重操作,而且两个RDD中每个元素中的值的个数、数据类型需要保持一致。
使用union()方法合并两个RDD
使用filter()方法进行过滤
filter()方法是一种转换操作,用于过滤RDD中的元素。
filter()方法需要一个参数,这个参数是一个用于过滤的函数,该函数的返回值为Boolean类型。
filter()方法将返回值为true的元素保留,将返回值为false的元素过滤掉,最后返回一个存储符合过滤条件的所有元素的新RDD。
创建一个RDD,并且过滤掉每个元组第二个值小于等于1的元素。
使用distinct()方法进行去重
distinct()方法是一种转换操作,用于RDD的数据去重,去除两个完全相同的元素,没有参数。
创建一个带有重复数据的RDD,并使用distinct()方法去重。
使用简单的集合操作
Spark中的集合操作常用方法(转换操作)
intersection()方法
intersection()方法用于求出两个RDD的共同元素,即找出两个RDD的交集,参数是另一个RDD,先后顺序与结果无关。
创建两个RDD,其中有相同的元素,通过intersection()方法求出两个RDD的交集。
subtract()方法
subtract()方法用于将前一个RDD中在后一个RDD出现的元素删除,可以认为是求补集的操作,返回值为前一个RDD去除与后一个RDD相同元素后的剩余值所组成的新的RDD。两个RDD的顺序会影响结果。
创建两个RDD,分别为rdd1和rdd2,包含相同元素和不同元素,通过subtract()方法求rdd1和rdd2彼此的补集。
cartesian()方法
cartesian()方法可将两个集合的元素两两组合成一组,即求笛卡儿积。
创建两个RDD,分别有4个元素,通过cartesian()方法求两个RDD的笛卡儿积。
创建键值对RDD
有很多种创建键值对RDD的方式,很多存储键值对的数据格式会在读取时直接返回由其键值对组成的PairRDD。
当需要将一个普通的RDD转化为一个PairRDD时可以使用map函数来进行操作,传递的函数需要返回键值对。
使用键值对RDD的keys和values方法
键值对RDD,包含键和值两个部分。
Spark提供了两种方法,分别获取键值对RDD的键和值。
使用键值对RDD的reduceByKey()方法
当数据集以键值对形式展现时,合并统计键相同的值是很常用的操作。
reduceByKey()方法用于合并具有相同键的值,作用对象是键值对,并且只对每个键的值进行处理,当RDD中有多个键相同的键值对时,则会对每个键对应的值进行处理。
reduceByKey()方法需要接收一个输入函数,键值对RDD相同键的值会根据函数进行合并并且创建一个新的RDD作为返回结果。
当数据集以键值对形式展现时,合并统计键相同的值是很常用的操作。
reduceByKey()方法用于合并具有相同键的值,作用对象是键值对,并且只对每个键的值进行处理,当RDD中有多个键相同的键值对时,则会对每个键对应的值进行处理。
reduceByKey()方法需要接收一个输入函数,键值对RDD相同键的值会根据函数进行合并并且创建一个新的RDD作为返回结果。
使用键值对RDD的groupByKey()方法
groupByKey()方法用于对具有相同键的值进行分组,可以对同一组的数据进行计数、求和等操作。
对于一个由类型K的键和类型V的值组成的RDD,通过groupByKey()方法得到的RDD类型是[K,Iterable[V]]。
使用join()方法连接两个RDD
将有键的一组数据与另一组有键的数据根据键进行连接,是对键值对数据常用的操作之一。
与合并不同,连接会对键相同的值进行合并,连接方式多种多样,包含内连接、右外连接、左外连接、全外连接,不同的连接方式需要使用不同的连接方法。
连接方法如下表。
(1)join()方法
join()方法用于根据键对两个RDD进行内连接,将两个RDD中键相同的数据的值存放在一个元组中,最后只返回两个RDD中都存在的键的连接结果。
例如,在两个RDD中分别有键值对(K,V)和(K,W),通过join()方法连接会返回(K,(V,W))。
创建两个RDD,含有相同键和不同的键,通过join()方法进行内连接。
(2)rightOuterJoin()方法
rightOuterJoin()方法用于根据键对两个RDD进行右外连接,连接结果是右边RDD的所有键的连接结果,不管这些键在左边RDD中是否存在。
在rightOuterJoin()方法中,如果在左边RDD中有对应的键,那么连接结果中值显示为Some类型值;如果没有,那么显示为None值。
(3)leftOuterJoin()方法
leftOuterJoin()方法用于根据键对两个RDD进行左外连接,与rightOuterJoin()方法相反,返回结果保留左边RDD的所有键。
(4)fullOuterJoin()方法
fullOuterJoin()方法用于对两个RDD进行全外连接,保留两个RDD中所有键的连接结果。
查看DataFrame数据
查看及获取数据的常用函数或方法
方法 | 描述 |
printSchema | 打印数据模式 |
show | 查看数据 |
first/head/take/takeAsList | 获取若干行数据 |
collect/collectAsList | 获取所有数据 |
将movies.dat电影数据上传至HDFS中,加载数据为RDD并将其转换为DataFrame.
1. printSchema:输出数据模式
printSchema函数查看数据模式,打印出列的名称和类型
2. show():查看数据
show()方法与show(true)方法一样,只显示前20条记录并且最多只显示20个字符
若是要显示所有字符,需要使用show(false)方法
show(numRows:Int)查看前n行记录
3.first()/head()/take()/takeAsList():获取若干条记录
4.collect()/collectAsList():获取所有数据
collect方法可以将DataFrame中的所有数据都获取到,并返回一个数组。
collectAsList方法可以获取所有数据,返回一个列表。
将DataFrame注册成为临时表,然后通过SQL语句进行查询
直接在DataFrame对象上进行查询,DataFrame提供了很多查询的方法
1.where()/filter()方法
(1)where()方法
DataFrame可以使用where(conditionExpr: String)根据指定条件进行查询
参数中可以使用and或or
该方法的返回结果仍然为DataFrame类型
(2)filter()方法
DataFrame还可使用filter筛选符合条件的数据
2.select()/selectExpr()/col()/apply()方法
(1)select()方法:获取指定字段值
select方法根据传入的string类型字段名,获取指定字段的值,以DataFrame类型返回
(2)selectExpr()方法:对指定字段进行特殊处理
selectExpr:对指定字段进行特殊处理,可以对指定字段调用UDF函数或者指定别名。
selectExpr传入String类型的参数,返回DataFrame对象。
(3)col()/apply()方法
col或者apply也可以获取DataFrame指定字段
col或者apply只能获取一个字段,并且返回对象为Column类型
首先简述了Spark SQL的基本概念,并且讲解了如何配置Spark SQL以及Spark SQL与Shell交互。
接着详细介绍了Spark SQL的核心抽象编程模型DataFrame及其基础操作,包括创建DataFrame对象、DataFrame的查询操作和输出操作。
最后使用Spark SQL对房屋售价数据进行探索分析,以此加深读者对Spark SQL的理解及操作。