Spark(2)-RDD

一、RDD介绍

    RDD(Resilient Distributed Datasets) ,弹性分布式数据集,是分布式内存的一
个抽象概念,RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,
只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建。

二、RDD弹性的特点

  1. 基于Lineage的高效容错(第n个节点出错,会从第n-1个节点恢复,血统容错);
  2. Task如果失败会自动进行特定次数的重试(默认4次);
  3. Stage如果失败会自动进行特定次数的重试(可以只运行计算失败的阶段),只计算
  失败的数据分片;
  4.数据调度弹性:DAG TASK 和资源管理无关;
  5.当空间不够的时候会自动的进行内存和磁盘数据存储的切换;

三、RDD
1.SparkContext

   Driver Programs 通过 SparkContext来访问
   Spark对象代表和一个集群的连接
   在shell中SparkContext自动创建好了,就是sc

2.RDDS

   一个RDD是一个不可改变的分布式集合对象。
   Spark中的计算都是通过RDDS的创建,转换,操作完成的。
   一个RDD内部由许多的partitions(分片)组成。

3.分片(partitions)

每个分片包含一部分的数据,partitions可在集群不同节点上计算。
分片是Spark并行处理的单元,Spark顺序的,并行的处理分片

4.RDDS的创建方法

(1)把一个存在的集合传递给SparkContext的parallelize()方法(测试的时候用):
     val rdd = sc.parallelize(Array(1,2,3,4),4);
     第一个参数:待并行处理的集合,第二个参数:分区的个数
(2)加载外部数据集
     val rddText=sc.textFile("helloSpark.txt") 

5.RDD-transformation(转化)

介绍:从以前的RDD中构建新的RDD
eg:map(),filter()
1、map():map()接收函数,把函数引应用到RDD的每一个元素中,返回新的RDD。map()返
回最优分区
eg:val lines2=lines.map(word=>(word,1));

2、filter():filter()接收函数,返回只包含满足filter()函数元素的新的RDD
eg:val lines3=lines.filter(word=>word.contains("hello"));  
    #contains() 返回的是hello
3、flatMap():对每个输入元素,输出多个元素    
    将RDD中的元素压扁后返回新的RDD
eg:val lines1=lines.flatMap(line=>line/split(" "));
    # hello world  => helloworld
4、RDD的集合运算  
  RDD支持数学集合运算,例如:交集,并集计算。
  rdd.distinct()去重
  rdd.union()并集
  rdd.intersection(rdd1) 交集
  rdd.subtract(rdd1)  rdd有rdd2没有。
注意:注意:RDD的所有转换操作都是lazy模式,即Spark不会立刻计算结果,而只是简
单的记住所有对数据集的转换操作。这些转换只有遇到action操作的时候才会开始计算。
这 样的设计使得Spark更加的高效。例如,对一个输入数据做一次map操作后进行reduce
操作,只有reduce的结果返回给driver,而不是把数据量更大的map操作后的数据集传递
给driver。

6.RDD-Action

  介绍:在RDD上计算出一个结果
  把结果返回给driver program或保存在文件系统中,count(),save
  常用的函数:

在这里插入图片描述
在这里插入图片描述

1、reduce():接收一个函数,作用在RDD两个类型相同的元素上,返回新元素。
可以实现RDD中元素类型的累加,计数,和其他类型的聚集操作
eg:val rdd=sc.parallelize(Array(1,2,3,3));
   rdd.reduce((x,y)=>x+y);   #9
2、take(n):返回RDD的n个元素(同时尝试返回最小的partitions)
返回结果是无序的,测试使用。
3、top():排序(根据RDD中数据的比较器)从大到小取RDD中的元素。
4、foreach():
计算RDD中的每个元素,但不返回本地。
可以配合println()友好的打印出数据。

7、Key-Value对RDDS

使用map()函数,返回Key/Value对
eg:包含数行数据的RDD,将每一行的第一个单词作为Keys,整行作为values
val rdd2=rdd.map(line=>(line.split(" ").(0),line))

在这里插入图片描述

eg:val rdd2=sc.parallelize(Array((1,2),(2,8),(2,4)))
    
    rdd3=rdd2.reduceByKey((x,y)=>x+y)    
    rdd3.foreach(print)  #(1,2)(2,12)
   
    rdd4=rdd2.groupBykey()
    rdd4.foreach(print) #(1,[2])(2,[4,8])

在这里插入图片描述

  eg:val rdd2=sc.parallelize(Array((1,2),(2,8),(3,4)))
     rdd3=rdd2.sortByKey()   #(1,2)(2,8)(3,4)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值