spark Rdd 操作transformaction和action等

transformation是惰性的,只有action操作的时候,才会真正执行。spark有很多api,RDD的api只是spark的一部分,是我们用的最多的api,在命令行使用的RDD很方便,但是想要看这些api的后台,可以使用IDE,在IDE里面写spark应用,可以观察的更清楚。

官网有最新的RDD Operations,可以好好参考。

一、Rdd的创建

1 通过已经存在的Scala集合,如:val paraRdd = sc.parallelize(1 to 9, 3);后面那个3是指有三个分区

2 通过HDFS、Hbase等,如:val hdfsRdd = sc.textFile("/usr/ouput", 3);如果/usr/ouput是个文件夹,那么就会把所有的子文件当成一个Rdd。3指的是这个Rdd最少有3个分区,有可能会有更多的分区。

3 其它的RDD的转换,如map操作,就会产生新的Rdd

二、transformation相当于一个转换,会将一个RDD转换,并返回一个新的RDD

1.filter,过滤

scala> textFile.filter(line => line.contains("hello")).count() // 有多少行含有hello 

Rdd里面每行元素都执行filter里的方法,只有返回true的元素才不会被过滤,返回false的元素会被过滤掉。

2.map,对Rdd中每一行元素执行一个函数,并且只会返回一行元素,对比flatMap,如下:

val inputMapRdd = inputRdd.map(line => line.split(" "));

用空格分开来的数据是一个数组,这个数组是Rdd的一个元素。

3.flatMap,对Rdd中每一行元素执行一个函数,有可能返回多行元素,如下:

val inputFlatMapRdd = inputRdd.flatMap(line => line.split(" "));

被空格分开来的每一个数据都是一行元素,这是跟map的本质区别。

4.mapPartitions,对每个partition统一执行函数,比如要对数据库操作时,可以使用此函数

下面这篇文章讲的非常详细,参考:Spark RDD API详解(一) Map和Reduce

5.union,将两个RDD进行合并,不去重。

6.intersection,两个RDD的交集,并且去重。

7.subtract,该函数类似于intersection,但返回在RDD中出现,并且不在otherRDD中出现的元素,不去重。

8.aggregate

def aggregate[U](zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U)(implicit arg0: ClassTag[U]): U

先用函数seqOp对分区每个元素进行操作,然后在和zeroValue操作得到每个分区的值

再用combOp对每个分区的值进行操作,,然后在和zeroValue操作得到最后的值

参考:Spark算子:RDD行动Action操作(3)–aggregate、fold、lookup

9.fold函数同aggregate,只是把seqOp和combOp都使用同一个op函数

def fold(zeroValue: T)(op: (T, T) ⇒ T): T

参考:Spark算子系列文章

三、action相当于执行一个动作,会返回一个结果:

1.count计算行数

scala> textFile.count() // RDD中有多少行 

四、缓存persist,cache

1.cache缓存在内存级别

2.persist缓存级别可调整

3.unpersist移除缓存

五、其他

1.toDebugString

A description of this RDD and its recursive dependencies for debugging.

2.partitions

查看Rdd的partition的数量,如:localRdd.partitions.size。

3.collect,当数据量大时,一定不要使用此方法。

返回Rdd的每一个元素,用数组保存,如果每个元素都是数组,那么就是数组里面包含数组。

参考:

spark中的action和transformation

Spark编程指引(三)-----------------RDD操作,shuffle和持久化

RDD:基于内存的集群计算容错抽象

Spark RDD API详解

 

转载于:https://my.oschina.net/cjun/blog/621593

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值