Spark--RDD编程模型

弹性分布式数据集(RDD)编程模型

1)        RDD设计目标

RDD用于支持在并行计算时能够高效地利用中间结果,支持更简单的编程模型,同时也具有像MapReduce等并行计算框架的高容错性、能够高效地进行调度及可扩展性。RDD的容错通过记录RDD转换操作的lineage关系来进行,lineage记录了RDD的家族关系,当出现错误的时候,直接通过lineage进行恢复。

2)        RDD抽象

RDDSpark中是一个只读的(val类型)、经过分区的记录集合。RDDSpark中只有两种创建方式:(1)从存储系统中创建;(2)从其它RDD中创建。从存储中创建有多种方式,可以是本地文件系统,也可以是分布式文件系统,还可以是内存中的数据。

下面的代码演示的是从HDFS中创建RDD

Scala> sc.textFile(“/readme.md”)

下面的代码演示的是从内存中创建RDD

Scala> val data = sc.parallelize( Array(1, 2, 3, 4, 5) )

下面的代码演示的是从其它RDD创建新的RDD

Scala> val filter = data.filter( x=>x>2 )

Scala> filter.collect()

3)        RDD编程模型

RDD的操作包括Transformations(转换)Actions两种。

transformations操作会将一个RDD转换成一个新的RDD,需要特别注意的是所有的transformation都是lazy的,transformation之后它不会立马执行,而只是会记住对相应数据集的transformation,只有触发action操作的时候才会真正执行。

 

基本的transformation 和 action的操作


实例开发:

Val rdd = sc.parallelize(List(1, 2, 3, 4, 5 ,6))

Val maprdd = rdd.map(_*2) //这是典型的函数式编程

Maprdd.collect()//上面的map是transformation,到了这里的collect才开始执行,返回一个Array    Array(2,4,6,8,10,12)

 

Val filterrdd = maprdd.filter(_>5)

Filterrdd.collect()//返回所有大于5的数据的一个Array, Array(6,8,10,12)

 

Val rdd = sc.textFile(“/xxx.txt”)

Rdd.count //计算行数

Rdd.cache//可以把rdd保留在内存里面

Rdd.count//计算行数,但是因为上面进行了cache,这里速度会很快

 

Val wordcount = rdd.flatMap(_.split(‘ ‘)).map((_,1)).reduceByKey(_+_)

//把每一行进行根据空格分割,然后flatMap会把多个list合并成一个list,最后把每个元素变成一个元组

//然后把具有相同key的元素的value进行相加操作,参考上面图片中的函数定义,针对reduceByKey,传入的函数是对value进行操作的。

Wordcount.saveAsTextFile(“xxx.txt”) //把结果存入文件系统

Worldcount.collect //可以得到一个数组

 

Val rdd1 = sc.parallelize(List((‘a’,1),(‘a’,2),(‘b’,3)))

Val rdd2 = sc.parallelize(List((‘a’,4),(‘b’,5)))

Val result_union = rdd1 join rdd2 //结果是把两个list做笛卡尔积,Array(('a', (1,4), ('a', (2,4), ('b', (3, 5)))

 

Val rdd = sc.parallelize(List(1,2,3,4))

Rdd.reduce(_+_) //reduce是一个action,这里的结果是10

 

val rdd = sc.parallelize(List(('a',1),(‘a’,2),('b',1),(‘b’, 2))

rdd.lookup("a") //返回一个seq, (1, 2) 是把a对应的所有元素的value提出来组成一个seq

 

val wordcount = rdd.flatMap(_.split(‘ ‘)).map(_,1).reduceByKey(_+_).map(x=> (x._2, x._1).sortByKey(false).map(x => (x._2, x._1))

//其实完成了一个sort by value的过程, sortByKey(false),表示倒序排列


参考资料:http://blog.csdn.net/yunlong34574/article/details/38635853

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值