spark方法

目录

目录

1.parallelize()方法

2.makeRDD()方法

3.map()方法转换数据

4,使用sortBy()方法进行排序

使用collect()方法查询数据

使用flaMap()方法转换数据

使用take()方法查询某几个值

                                     使用filter()方法进行过滤

使用简单的集合操作

使用键值对RDDd Keys和values方法

使用键值对RDD 的 groupByKey()方法 groupByKey()方法

使用join()方法连接两个RDD


1.parallelize()方法

1,创建RDD
从内存中创建一个RDD有两种常用的方法。一种是转化Seq集合为RDD,另一种是从已有RDD转化为新的RDD。

SparkContext类中有两个方法:parallelize和makeRDD。

1.parallelize()方法

parallelize有两个参数可以输入

(1)要转化的集合,必须是Seq集合。

(2)分区数,一般不设分区数,则默认为该Application分配到的资源的CPU函数。
parallelizeO方法有两个输入参数,说明如下。
(1)要转化的集合:必须是Seq集合。 Seq表示序列, 指的是一类具有一定长度的、
可迭代访问的对象, 其中每个数据元素均带有一个从0开始的 、固定的索引。
(2)分区数。若不设分区数,则 RDD 的分区数默认为该程序分配到的资源的 CPU核心数。
通过 parallelizeO方法用一个数组的数据创建 RDD, 并设置分区数为4,如代码3-1所
示,创建后查看该RDD的分区数, 结果如图3-1所示。

2.makeRDD()方法

makeRDD)方法有两种使用方式, 第一种使用方式与parallelize()方法一致 ;第二种
式是通过接收一个 Seq[(T,Seq[String])]参数类型创建RDD. 第二种方式生成的RDD
保存的是T的值,Seq[String]部分的数据会按照 Seq[(T,Seq[String])]的顺序存放到各
分区中,一个Seq[String]对应存放至一个分区, 并为数据提供位置信息,通过
referredLocations()方法可以根据位置信息查看每一个分区的值。 调用makeRDD)时不
J以直接指定RDD的分区个数,分区的个数与 Seq[String]参数的个数是保持一致的。
用makeRDDO方法创建RDD, 并根据位置信息查看每一个分区的值,

如代码 3-2所示,结果如图3-2所示。代码3-2 使用makeRDD()方法创建RDD 并查看各分区的值

3.map()方法转换数据

mapO方法是一种基础的RDD转换操作,可以对 RDD中的每一个数据元素通过某种函数进行转换并返回新的RDD。map)方法是懒操作 ,不会立即进行计算。

转换操作是创建RDD的第二种方法, 通过转换已有RDD生成新的RDD。

因为RDD是一个不可变的集合,所以如果对RDD 数据进行了某种转换,那么会生成一个新的 RDD。
例如,通过一个存放了5个Int 类型的数据元素的列表创建一个RDD, 可通过map)方法对
每一个元素进行平方运算,结果会生成一个新的 RDD。

4,使用sortBy()方法进行排序

sortByO方法用于对标准RDD进行排序,有3 个可输人参数,说明如下。
(1)第1个参数是一个函数f:(T)=>K, 左边是要被排序对象中的每一个元素, 右边返
回的值是元素中要进行排序的值。
(2)第2个参数是ascending,决定排序后RDD 中的元素是升序的还是降序的,默认
是true,即升序排序, 如果需要降序排序则需要将参数的值设置为 false。
(3)第3个参数是numPartitions,决定排序后的 RDD的分区个数,默认排序后的分区个数和排序后的分区个数和排序之前的分区个数相等,既this.partitions.size.se。

使用collect()方法查询数据

collect)方法是一种行动操作,可以将RDD 中所有元素转换成数组并返回到Driver端,
适用于返回处理后的少量数据。 因为需要从集群各个节点收集数据到本地,经过网络传输 .
并且加载到Driver内存中,所以如果数据量比较大, 会给网络传输造成很大的压力。因此,
数据量较大时,尽量不使用collect)方法 ,否则可能导致Driver端出现内存溢出问题。collectO
方法有以下两种操作方式。
(1)collect:直接调用collect返回该RDD中的所有元素, 返回类型是 一个Array[T]数
组,这是较为常用的一种方式。
使用collect)方法查看在代码3-6和代码3-7中sq_dist和 sort_data的结果,如代码3-8
所示,结果如图3-3所示,分别返回了经过平方运算后的 Int类型的数组和对元组第二个值
进行降序排列后的数组。


(2)collect[U: ClassTag](f:PartialFunction[T, U]): RDD[U]。这种方式需要提供一个标
准的偏函数,将元素保存至一个RDD中。 首先定义一个函数one,用于将collect方法得到
的数组中数值为1的值替换为“one”,将其他值替换为 “other”。创建一个只有3个Int
类型数据的RDD,在使用collect)方法时将one 函数作为参数。

使用flaMap()方法转换数据

flatMap()方法将函数参数应用于RDD 之中的每一个元素,将返回的迭代器 (如数组、
列表等)中的所有元素构成新的RDD。使用 flatMap()方法时先进行map(映射)再进行 flat
(扁平化)操作,数据会先经过跟 map()方法一样的操作, 为每一条输入返回一个迭代器(可
迭代的数据类型),然后将所得到的不同级别的迭代器中的元素全部当成同级别的元素,返
回一个元素级别全部相同的RDD。 这个转换操作通常用来切分单词。
例如,分别用map()方法和 flatMap()方法分割字符串。用map()方法分割后 ,每个元素
对应返回一个迭代器,即数组。 flatMap()方法在进行同 map()方法一样的操作后,将3个迭
代器的元素扁平化(压成同一级别), 保存在新RDD中。

                                                如代码3-10所示, 结果如图3-5所示。

使用take()方法查询某几个值

take(N)方法用于获取RDD的前N个元素,返回数据为数组。take()与collect()方法的原理相似,collect()方法用于获取全部数据,take()方法获取指定个数的数据获取RDD的前5个元素。

使用union()方法合并多个RDD
union()方法是一种转换操作,用于将两个RDD 合并成一个,不进行去重操作,而且两
个RDD中每个元素中的值的个数、 数据类型需要保持一致。创建两个存放二元组的 RDD,
通过unionO方法合并两个RDD, 不处理重复数据,并且每个二元组的值的个数、 数据类型
都是一致的,如代码3-13所示, 结果如图3-8所示。

使用filter()方法进行过滤
 

filter()方法是一种转换操作,用于过滤RDD中的元素。 filter)方法需要一个参数,这
个参数是一个用于过滤的函数,该函数的返回值为 Boolean类型。filter)方法将返回值为true
的元素保留,将返回值为false的元素过滤掉, 最后返回一个存储符合过滤条件的所有元素
的新RDD。
创建一个RDD,并且过滤掉每个元组第二个值小于等于1 的元素,如代码3-14所示。
其中第一个filter)方法中使用了“2”,第一个“-” 与第二个filter()方法中的“x”一样,
均表示RDD的每 一个元素,结果如图3-9所

使用distinct()方法进行去重
distinct)方法是一种转换操作,用于RDD的数据去重, 去除两个完全相同的元素,没
有参数。创建一个带有重复数据的RDD, 并使用distinct)方法去重,如代码3-15所示,通
过collectO方法查看结果,如图3-10所示, 其中重复的数据(a',l)已经被删除。
代码3-15distinct()方法示例

使用简单的集合操作

RDD 是一个分布式的数据集合,因此也有一些与数学中的几何操作类似的操作,如交集,并集,补集,和迪卡儿积等。Spark中的集合操作常用方法如图表所示。

(1)intersection()方法
intersection)方法用于求出两个RDD的共同元素, 即找出两个RDD的交集,参数是另
一个RDD,先后顺序与结果无关。创建两个RDD, 其中有相同的元素,通过intersectionO
方法求出两个RDD的交集, 如代码3-16所示,结果如图3-11 所示,共同元素为(a,1)、(b,1)。

(2)subtract)方法
Subtract()方法用于将前一个RDD中在后一个RDD 出现的元素删除,可以认为是求补集
的操作,返回值为前一个RDD去除与后一个RDD 相同元素后的剩余值所组成的新的RDD。
两个RDD的顺序会影响结果。创建两个RDD,分别为 rdd1和rdd2,包含相同元素和不同元
素,通过subtract()方法求rdd1和rdd2彼此的补集。

                                 如代码3-17所示,结果如图3-12所示。

(3)cartesian()方法
cartesian()方法可将两个集合的元素两两组合成一组, 即求笛卡儿积。假设集合A有5
个元素,集合B有10个元素, 集合A的每个元素都会和集合B 的每个元素组合成一组,结
果会返回50个元素组合。例如, 创建两个RDD,分别有4个元素,通过 cartesian()方法求两
个RDD的笛卡儿积,如代码3-18所示,结果如图 3-13所示,得到一个包含16个元组的 IRDD。

使用键值对RDDd Keys和values方法

键值对RDD。包含键和值两个值。Spark提供了两种方法,分别获取键值对RDD的键和值。keys方法返回一个仅包含键的RDD,value是方法返回一个仅包含值的RDD。

 使用键值对 RDD 的reduceByKey()方法

当数据集以键值对形式展现时,合并统计键相同的值是很常用的操作。

reduceByKey()方法用于合并具有相同键的值, 作用对象是键值对, 并且只对键的值进行处理。reduceByKey()方法需要接收一个输入函数, 键值对 RDD 相同键的值会根据函数进行合并,并创建一个新的RDD 作为返回结果。键值对 RDDreduceByKey() 在进行处理时,

reduceByKey()方法将相同键的前两个值传给输入函数, 方法产生一个新的返回值,新产生的返回值与RDD 中相同键的下一个值组成两个元素,再传给输入函数,直到最后每个键只有一个对应的值为止。

reduceByKey()方法不是一种行动操作,而是一种转换操作。 定义一个含有多个相同键的键值对 RDD, 使用 reduceByKey()方法对每个键的值进行求和。

                                                如代码3-22所示, 结果如图3-17所示。

使用键值对RDD 的 groupByKey()方法 groupByKey()方法

用于对具有相同键的值进行分组,可以对同一组的数据进行计数、求和等操作。对于一个由类型K的键和类型V的值组成的RDD,。

通过groupByKey()方法得到的RDD 类型是[K, Iterable[V]]。键值对 RDDgroupByKey() 例如,对图3-17中的 rdd _1根据键进行分组,查看分组中的值,并对每个分组的值的数量进行统计。

使用join()方法连接两个RDD

join()方法
将一组有键的数据与另一组有键的数据根据键进行连接,是对键值对数据常用的操作之一。与合并不同,连接会对键相同的值进行合并,连接方式多种多样,包含内连接、右外连接、左外连接、全外连接,不同的连接方式需要使用不同的连接方法。

1)join()方法
join(方法用于根据键对两个RDD进行内连接,将两个RDD中键相同的数据的值存放在一个元组中,最后只返回两个RDD中都存在的键的连接结果。例如,在两个RDD中分别有键值对( K , V )和,通过join()方法连接会返回(K,(V,W))。( K , W )

2)rightOuterJoin()方法
rightOuterJoin()方法用于根据键对两个RDD进行右外连接,连接结果是右边RDD 的所有键的连接结果,不管这些键在左边RDD中是否存在。在rightOuterJoin()方法中,如果在左边RDD中有对应的键,那么连接结果中值显示为Some类型值;如果没有,那么显示为None值。对图3-20中的rdd1和rdd2进行右外连接,

fullOuterJoin()方法
fullOuterJoin()方法用于对两个RDD进行全外连接,保留两个RDD中所有键的连接结果,对图3-20中的rdd1和rdd2进行全外连接。

使用zip()方法组合两个RDD
zip()方法用于将两个RDD组合成键值对RDD,要求两个RDD的分区数量以及元素数量相同,否则会抛出异常
将两个非键值对RDD组合成一个键值对RDD,两个RDD的元素个数和分区个数都相同,

使用 combineByKe y ( )方法合并相同键的值
combineBK e y ()方法是Spark中一个比较核心的高级方法,键值对的一些其他高级方法的底层均是使用combineByKey()方法实现的,如groupBy-Key()方法、reduceByKey()方法等。
combineByKey()
方法
combineByKey()方法用于将键相同的数据合并,并且允许返回与输入数据的类型不同的返回值,combineByKey()方法的使用方式如下

lookup(key:K)方法用于返回键值对RDD指定键的所有对应值。例如,通过lookup0方法查询图3-25的test中键为panda的所有对应值。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值