什么是RDD

RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。 
RDD的属性

一组分片(Partition),即数据集的基本组成单位。对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目。

一个计算每个分区的函数。Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。

RDD之间的依赖关系。RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。

一个Partitioner,即RDD的分片函数。当前Spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner。只有对于于key-value的RDD,才会有Partitioner,非key-value的RDD的Parititioner的值是None。Partitioner函数不但决定了RDD本身的分片数量,也决定了parent RDD Shuffle输出时的分片数量。

一个列表,存储存取每个Partition的优先位置(preferred location)。对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。 
基本RDD操作 
创建RDD: 
1)读取外部数据集 
val file=sc.textFile(“hdfs://hadoop1:9000/input/word/word.txt”)

2)在驱动器程序中对一个集合进行并行化
val lines = sc.parallelize(List("pandas","i like pandas"))

RDD操作: 
RDD转化操作是返回一个新的RDD的操作,比如map()和filter() 
RDD行动操作则是向驱动器程序返回结果或把结果写入外部系统的操作,会触发实际的计算 
1)转化操作 
val inputRDD = sc.textFile(“hdfs://hadoop1:9000/input/word/word.txt”)

    val keyRDD = inputRDD.filter(line => line.contains("guofei"))

2)行动操作0
val keyRDD = inputRDD.filter(line => line.contains("guofei")) wantRDD.take(10).foreach(println)

常见的转化操作和行动操作 
1.转化操作 
map()与flatMap()区别 
flatMap 将函数应用于RDD中的每个元素,将返回的迭代器的所有的内容构成新的RDD,通常用来切分单词 
val lines = sc.parallelize(List(“come on”,”guofei”)) 
var words = lines.flatMap(line => line.split(” “)) 
words.collect()

map 将函数应用于RDD中的每个元素,将返回值构成新的RDD
var words1 = lines.map(line => line.split(" "))
words1.collect() filter 返回一个由通过传给filter()的函数的元素组成的RDD
val list = sc.parallelize(List(1,2,3,3))
val listFilter = list.filter(x => x != 1)
listFilter.collect() distinct 去重
val listDistinct = list.distinct()
listDistinct.collect() union() 生成一个包含俩哥哥RDD中所有元素的RDD
val list = sc.parallelize(List(3,4,5))
val list1 = sc.parallelize(List(1,2,3))
val union = list.union(list1)
union.collect() intersection() 求两个RDD共同的元素的RDD
list.intersection(list1).collect() subtract() 移除里一个RDD中的内容
list.subtract(list1).collect() cartesian() 与另一个RDD的笛卡儿积
list.cartesian(list1).collect()

2.行动操作 
reduce() 
val list = sc.parallelize(List(3,4,5)) 
list.reduce((x,y) => x + y)

collect() 返回RDD中的所有元素
count() RDD中的元素个数
countByValue() 各元素在RDD中出现的次数
take(num) 从RDD中返回num个数
top(num) RDD中返回最前面的num个元素
takeOrdered(num)(ordering) 从RDD中按照提供的舒徐返回最前见的num元素
reduce(func) 并行整合RDD中左右数据
fold(zero)(func) 和reduce一样,但是需要提供初始值
aggregate(zeroValue)(seqOp,combOp) 和reduce相似,但是通常返回不同类型的函数

键值对操作: 
创建Pair RDD

使用第一个单词作为键创建出一个pair RDD 
val file=sc.textFile(“hdfs://hadoop1:9000/input/word/word.txt”) 
file.map(x => (x.split(” “)(0),x)).collect()

Pair RDD的转化操作 
创建Pair 
val list1 = sc.parallelize(List((1,2),(3,4),(3,6))) 
list1.collect()

reduceByKey(func) 合并具有相同键的值 
list1.reduceByKey((x,y) => x+y).collect()

groupByKey() 对具有相同键的值进行分组 
list1.groupByKey.collect()

mapValues(func) 对pair RDD中的每个值应用一个函数而不改变键 
list1.mapValues(x => x+1).collect()

flatMapValues(func) 对pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键对记录。通常用于符号化 
list1.flatMapValues(x => (x to 5)).collect()

keys() 返回一个仅包含键的RDD 
list1.keys.collect()

values() 返回一个仅包含值得RDD 
list1.values.collect()

sortByKey() 返回一个根据键排序的RDD 
list1.sortByKey().collect()

针对两个pair RDD的转化操作 
val rdd = sc.parallelize(List((1,2),(3,4),(3,6))) 
val other = sc.parallelize(List((1,2)))

subtractByKey 删掉RDD中键与other中的键相同的元素 
rdd.subtractByKey(other).collect()

join 对两个RDD进行内连接 
rdd.join(other).collect()

leftOuterJoin() 对两个RDD进行连接操作,确保第二个RDD的键必须存在(左外连接) 
rdd.leftOuterJoin(other).collect()

cogroup() 将两个RDD中拥有相同键的数据分组到一起 
rdd.cogroup(other).collect()

Spark 基础及RDD基本操作的更多相关文章

  1. Spark笔记:RDD基本操作(上)

    本文主要是讲解spark里RDD的基础操作.RDD是spark特有的数据模型,谈到RDD就会提到什么弹性分布式数据集,什么有向无环图,本文暂时不去展开这些高深概念,在阅读本文时候,大家可以就把RDD当 ...

  2. Spark笔记:RDD基本操作(下)

    上一篇里我提到可以把RDD当作一个数组,这样我们在学习spark的API时候很多问题就能很好理解了.上篇文章里的API也都是基于RDD是数组的数据模型而进行操作的. Spark是一个计算框架,是对ma ...

  3. Spark基础和RDD

    spark 1. Spark的四大特性 速度快 spark比mapreduce快的两个原因 基于内存 1. mapreduce任务后期在计算的是时候,每一个job的输出结果都会落地到磁盘,后续有其他的 ...

  4. Spark RDD/Core 编程 API入门系列 之rdd实战(rdd基本操作实战及transformation和action流程图)(源码)(三)

    本博文的主要内容是: 1.rdd基本操作实战 2.transformation和action流程图 3.典型的transformation和action RDD有3种操作: 1.  Trandform ...

  5. Spark基础:(二)Spark RDD编程

    1.RDD基础 Spark中的RDD就是一个不可变的分布式对象集合.每个RDD都被分为多个分区,这些分区运行在分区的不同节点上. 用户可以通过两种方式创建RDD: (1)读取外部数据集====> ...

  6. Spark基础入门(01)—RDD

    1,基本概念 RDD(Resilient Distributed Dataset) :弹性分布式数据集 它是Spark中最基本的数据抽象,是编写Spark程序的基础.简单的来讲,一个Spark程序可以 ...

  7. 【Spark基础】:RDD

    我的代码实践:https://github.com/wwcom614/Spark 1.RDD是Spark提供的核心抽象,全称为Resillient Distributed Dataset,即弹性分布式 ...

  8. spark基础知识

    1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架. dfsSpark基于mapreduce算法实现的分布式计算,拥有HadoopM ...

  9. 最全的spark基础知识解答

    原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...

随机推荐

  1. OGG_GoldenGate安装和环境搭建(案例)

    2014-03-02 Created By BaoXinjian

  2. 转:ASP.NET MVC 将IList<T>导出Excel文档的泛型类

    /// <summary> /// 提供将泛型集合数据导出Excel文档. /// </summary> /// <typeparam name="T" ...

  3. mysql查询-不存在记录时赋对应的数据

    使用mysql数据库,执行查询的时候,有时候就不存在记录,但是正好在不存在记录的时候又需要给赋予相应的查询结果字段,代码实现如下: select IFNULL(('), '1970-01-01 00: ...

  4. 【Android】7.6 FrameLayout(帧布局)

    分类:C#.Android.VS2015: 创建日期:2016-02-11 一.简介 帧布局是显示多个层次图的有效手段.比如第3章介绍的百度地图就是利用帧布局来实现的,它将图层分为22级分别缓存到指定 ...

  5. 苹果开发小记(一):NSString 的比较用法

    转自:http://blog.sina.com.cn/s/blog_897dd7be0100teh6.html 做了几个月的苹果,很多的思想方法都可以遵循一定规律来做的.NSString 比较字符串, ...

  6. node js 调试方法

    1. node-debug tutorial 大家对nodejs调试应该都比较头疼,至少我这个不用IDE写js的人很头疼这个,其实node的生态圈非常好 有非常好的工具和非常潮的开发方式 这里总结了3 ...

  7. 常用的Eclipse设置

    每次新建work space的时候,我都要修改一些默认设置,每次都要花一些时间找在哪里设置,总结如下. 启动加速 1. 去掉XML Validataion Windows --> Prefere ...

  8. 利用Django中的url方法实现地址动态拼接自动生成超链接地址

    目标 建立一个图书列表页面,显示图书名列表,并实现点击书名跳转到图书详细页面,显示图书详细信息. URL方法简介 功能:返回一个绝对路径的引用(不包含域名的URL):该引用匹配一个给定的视图函数和 一 ...

  9. Android开发:keytool' 不是内部或外部命令 也不是可运行的程序

    今天在更改keystore密码的时候,发生了这个问题:keytool' 不是内部或外部命令 也不是可运行的程序. 本来以为很简单觉得的问题,在网上搜索了一大堆答案,都不是我想要的,故在此记录下我的解决 ...

  10. Android开发日记(五)

    从服务器端传递多个数据 先在服务器端设置cs文件 using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using Syst ...