什么是RDD?
RDD(Rdeilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显示地将工作集缓存在内存中,后续的查询能够重用工作集,这极大的提升了查询速度。
RDD的属性(源码注释)
- 一组分片
- 一个计算每个分区的函数
- RDD之间的依赖关系
- 一个partitioner,即RDD的分片函数
- 一个列表,存储存取每个partitioner的优先位置(preferred location)
Transformation(图片来源官网)
RDD中的所有转换都是延迟加载的,也就是说,他们并不会直接计算结果。相反的,他们只是记住应用到基础数据集(例如一个文件)上的转换动作,只有当发生一个要求返回结果给Driver的动作时,这些转换才会真正的运行。这种设计让spark更加有效的运行。
Action(图片来源官网)
转换 | 含义 |
---|---|
map(func) | 返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成 |
filter(func) | 返回一个新的RDD,该RDD由经过func函数计算后返回值为true的输入元素组成 |
flatMap(func) | 类似于map。但是每一个输入元素可以被映射为0或多个输出元素(所以func应该返回一个序列,而不是单一元素) |
union(otherDataset) | 对源RDD和参数RDD求并集后返回一个新的RDD |
intersection(otherDataset) | 对源RDD和参数RDD求交集后返回一个新的RDD |
distinct(numTasks) | 对源RDD进行去重后返回一个新的RDD |
groupByKey(numTasks) | 在一个(k,v)的RDD上调用,返回一个(k,interator)的RDD |
reduceByKey(func,[numtasks]) | 在一个(k,v)的RDD上调用,返回一个(k,v)的RDD,使用指定的reduce函数,将相同的key的值聚合到一起,与groupByKey类似,reduce任务的个数可以通过第二个可选的参数来设置 |
sortByKey([ascending],[numTasks]) | 在一个(k,v)的RDD上调用,K必须实现ordered接口,返回一个按照key进行排序的(k,v)的RDD |
sortBy(func,[ascending],[numTasks]) | 与sortByKey类似,但是更灵活 |
动作 | 含义 |
---|---|
reduce(func) | 通过func函数聚集RDD中的所有的元素,这个功能必须是可交换且可并联的 |
collect() | 在驱动程序中,以数组的形式返回数据的所有的元素 |
count() | 返回RDD 的元素个数 |
first() | 返回RDD的第一个元素(类似于take(1)) |
take(n) | 返回一个有数据集的钱n个元素组成的数据 |