Spark之Transformations算子(一)

对于Spark学习来说,掌握常用的诸多算子,是学习的关键,在这里对于一部分算子进行介绍。

首先,对于RDD的生成,通常有两种方式:

  1. 可通过并行化scala集合创建RDD
    val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8),5);前面传入的数据,后面可以传入分区的数目,也可以不传
  2. 通过HDFS支持的文件系统创建,RDD里没有真的数据,只是记录了元数据
    val rdd2 = sc.textFile("hdfs://192.168.100.122:9000/wordcount/input");后面的参数,是数据的路径,也可以配置本地路径,不过在本地使用常常会出问题,建议是直接使用HDFS路径;同样,后面也可以传入分区数目,也可以选择不传。

下面开始算子的介绍,根据官网的顺序来;附官网链接:Spark算子

通常,Spark算子分为两大类型:

  1. Transformations:这一类算子,对于RDD只是记录转化的步骤,而实际上并不进行真正的操作
  2. Actions:这一类算子,才真正会把前面记录下来的针对RDD的操作进行实现

两类算子的区别,有点像数据库的事务处理,用户进行的一系列操作都会记录下来,作为一个事务的组成部分,而直到提交事务的时候,整个事务的所有操作才真正开始进行;这里的用户每个操作就好比Transfomation算子,而最后的提交,才是Action算子的操作。

按照顺序,先介绍Transformations算子。

(1)map算子


map算子,对于数据集内的每个元素都会进行操作,而这个操作,就是传入的function,也就是说,这个function的传参类型,是根据数据集内的元素来定的,如果是整数,则操作整数,如果是其他值,则相应操作,操作有点类似于MapReduce里的操作,因为RDD实际上也就是个分布式的数据集,能够让用户实现并行化的操作。


上左图是代码,对于List中的每个元素都进行了添加test字符串的操作,而输出的结果则是右图所示;而且,此处可以传递其他的参数,重点在于类型无误,均可以使用,其实质就相当于MapReduce内的Map函数。


这里,也可以传入其他类型,如上图传入的就是key-value类型的数据,最终得到结果

(2)filter算子


顾名思义,起到的是过滤作用,传入参数仍然是函数,返回那些满足条件的数据组成的数据集。


如上图,选择key=first的数据,最终得到结果为1;scala中偏函数用的比较多,在不能用的情况下,还是要采取最原始的方式,如上图第三行这种输出形式。

(3)flatMap算子


一直没看懂这个东西跟map到底有什么区别,官网介绍是,与map操作近似,但是每一个输入项目,可以产生0个或者多个输出项,所以每个元素返回的是一个数据集,而不是单独的项目;这一点是唯一的区别,就在于输出项的个数。

wordcount中,就用过该算子,对于上图来说,输出的count计数就是16个,因为函数对于每个元素进行操作,产生了不止一个输出,上图单词总数,就是16.

(4)mapPartitions


参照官网介绍,传入的依旧是一个函数,功能类似于map,但针对于rdd的每个块,也就是每个分区进行操作,所以函数传入的参数实际上是一个迭代器类型,而返回的数据,也是一个迭代器类型。


对于上图,输出的分区数目都是2,第一个结果是6 15,第二个结果是36 45,也就是对两个分区分别进行操作,其功能大致如此,简而言之,就是实现对两个分区并行的操作和处理。

(5)mapPartitionsWithIndex


与mapPartitions操作类似,但提供了代表分区号的参数,所以传入的参数func函数,必须带有分区号的参数:


(6)sample

字面意思,样本,就是从选定的数据集中,取出来一部分随机样本,其中使用给定的随机数据生成器;其中replacement代表抽样的数据是否放回,true代表放回,false代表不放回;fraction代表抽样的比例,0.5则代表抽取一半,sedd为随机数种子,可以使用当前的时间戳。


(7)Union

如图所示,传入参数为另一个数据集,二者取并集

(8)intersection


传入参数为另一个数据及,两者取交集。

(9)distinct



在不传入参数的时候,返回的是个非重复的数据集;如果传入参数的话,必须是个整数,即分区的数据,按照两个分区来对各自的数据进行去重操作。

(10)groupByKey


按照上图介绍,有点类似于MapReduce中的shuffle操作,可以通过设置分区的数目来提高并行度;但如果是为了聚合或者取平均值操作,建议采用另外两个算子。

对于该函数,首先,只能用于pairRdd,即操作的数据集必须是key-value类型的,执行的操作,就是把拥有相同key值的元素进行聚合,图中说的很明白,此处不赘述了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值