新手小白轻松拿捏Spark编程基础!!!

本章我们将学习Spark RDD的创建方法、RDD和键值对RDD的转换操作和行动操作的基础使用

一,1认识RDD
RDD是一个容错的、只读的、可进行并行操作的数据结构,是一个分布在集群各个节点中的存放元素的集合。RDD的创建有3种不同的方法。
第一种是将程序中已存在的Seq集合(如集合、列表、数组)转换成RDD。
第二种是对已有RDD进行转换得到新的RDD,这两种方法都是通过内存中已有的集合创建RDD的。
第三种是直接读取外部存储系统的数据创建RDD。

2,从内存中读取数据创建RDD
(1) parallelize()

parallelize()方法有两个输入参数。
要转化的集合,必须是Seq集合。Seq表示序列,指的是一类具有一定长度的、可迭代访问的对象,其中每个数据元素均带有一个从0开始的、固定的索引。
分区数。若不设分区数,则RDD的分区数默认为该程序分配到的资源的CPU核心数。

(2)makeRDD()

makeRDD()方法有两种使用方式。

第一种方式的使用与parallelize()方法一致;

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


3,从外部存储系统中读取数据创建RDD
从外部存储系统中读取数据创建RDD可以有很多种数据来源,可通过SparkContext对象的textFile()方法读取数据集,该方法支持多种类型的数据集,如目录、文本文件、压缩文件和通配符匹配的文件等,并且允许设定分区个数。

Spark RDD提供了丰富的操作方法用于操作分布式的数据集合,包括转换操作和行动操作两部分。 转换操作可以将一个RDD转换为一个新的RDD,但是转换操作是懒操作,不会立刻执行计算; 行动操作是用于触发转换操作的操作,这时才会真正开始进行计算。

4.使用map()方法转换数据

map()方法是一种基础的RDD转换操作,可以对RDD中的每一个数据元素通过某种函数进行转换并返回新的RDD。 map()方法是转换操作,不会立即进行计算。 转换操作是创建RDD的第二种方法,通过转换已有RDD生成新的RDD。因为RDD是一个不可变的集合,所以如果对RDD数据进行了某种转换,那么会生成一个新的RDD。

5.使用sortBy()方法进行排序

sortBy()方法用于对标准RDD进行排序,有3个可输入参数

 第1个参数是一个函数f:(T) => K,左边是要被排序对象中的每一个元素,右边返回的值是元素中要进行排序的值。

第2个参数是ascending,决定排序后RDD中的元素是升序的还是降序的,默认是true,即升序排序,如果需要降序排序那么需要将参数的值设置为false。

第3个参数是numPartitions,决定排序后的RDD的分区个数,默认排序后的分区个数和排序之前的分区个数相等,即this.partitions.size。 第一个参数是必须输入的,而后面的两个参数可以不输入。

6.使用collect()方法查询数据

collect()方法是一种行动操作,可以将RDD中所有元素转换成数组并返回到Driver端,适用于返回处理后的少量数据。 因为需要从集群各个节点收集数据到本地,经过网络传输,并且加载到Driver内存中,所以如果数据量比较大,会给网络传输造成很大的压力。 因此,数据量较大时,尽量不使用collect()方法,否则可能导致Driver端出现内存溢出问题。

7.使用flatMap()方法转换数据

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

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

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

9.使用union()方法合并多个RDD

union()方法是一种转换操作,用于将两个RDD合并成一个,不进行去重操作,而且两个RDD中每个元素中的值的个数、数据类型需要保持一致。 使用union()方法合并两个RDD

10.使用filter()方法进行过滤

filter()方法是一种转换操作,用于过滤RDD中的元素。 filter()方法需要一个参数,这个参数是一个用于过滤的函数,该函数的返回值为Boolean类型。 filter()方法将返回值为true的元素保留,将返回值为false的元素过滤掉,最后返回一个存储符合过滤条件的所有元素的新RDD。 创建一个RDD,并且过滤掉每个元组第二个值小于等于1的元素。

11.使用distinct()方法进行去重

distinct()方法是一种转换操作,用于RDD的数据去重,去除两个完全相同的元素,没有参数。 创建一个带有重复数据的RDD,并使用distinct()方法去重。

Spark中的集合操作常用方法(转换操作)

二,了解键值对RDD

Spark的大部分RDD操作都支持所有种类的单值RDD,但是有少部分特殊的操作只能作用于键值对类型的RDD。 顾名思义,键值对RDD由一组组的键值对组成,这些RDD被称为PairRDD。PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口。 例如,PairRDD提供了reduceByKey()方法,可以分别规约每个键对应的数据,还有join()方法,可以把两个RDD中键相同的元素组合在一起,合并为一个RDD。

(2)使用键值对RDD的keys和values方法

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

values方法返回一个仅包含值的RDD。

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

当数据集以键值对形式展现时,合并统计键相同的值是很常用的操作。 reduceByKey()方法用于合并具有相同键的值,作用对象是键值对,并且只对每个键的值进行处理,当RDD中有多个键相同的键值对时,则会对每个键对应的值进行处理。 reduceByKey()方法需要接收一个输入函数,键值对RDD相同键的值会根据函数进行合并并且创建一个新的RDD作为返回结果。

在进行处理时,reduceByKey()方法将相同键的前两个值传给输入函数,产生一个新的返回值,新产生的返回值与RDD中相同键的下一个值组成两个元素,再传给输入函数,直到最后每个键只有一个对应的值为止。reduceByKey()方法不是一种行动操作,而是一种转换操作。

groupByKey()方法用于对具有相同键的值进行分组,可以对同一组的数据进行计数、求和等操作。 对于一个由类型K的键和类型V的值组成的RDD,通过groupByKey()方法得到的RDD类型是[K,Iterable[V]]。

所有代码如下:

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值