什么是RDD?
RDD 是一个分布式的可变集合
常用的Transformation(即转换,延迟加载)
通过并行化scala集合创建RDD
数据既可以放到内存当中,又可以放在磁盘当中
五个特点:
1、一系列分区组成
2、每一个分区上都会有一个函数作用在上面
3、RDD和RDD之间存在依赖关系
4、如果RDD里面装的是Key-value类型,有分区器
5、如果是从hdfs这种文件系统中创建RDD,会有最优位置,是为了数据本地化
RDD是一个逻辑概念,一个RDD中有多个分区,一个分区在executor节点上执行时,他就是一个迭代器
一个RDD有多个分区,一个分区肯定在一台机器上。在hdfs中读取数据是一个切片对应一个分区。
RDD就相当于一个代理对象,实际操作的数据分布在多台机器上,对RDD操作实际上就是对每一个分区
进行操作,也就是对每一台机器上的那个迭代器进行操作,应为迭代器引用这要操作的数据。
RDD从hdfs上读取数据首先会生成一个hadoopRDD,hadoopRDD返回值是一个[K,V]类型的RDD,key是偏
移量,value是内容,返回的时候只返回value
spark执行wordcount生成几个RDD
sc.textFile("hdfs://spark/input/a.txt").flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_).saveAsTextFile("/")
·sc.textFile("hdfs://spark/input/a.txt") 生成2个RDD
生成两个RDD,首先从hdfs获取上数据的时候生成一个hadoopRDD,生成的RDD是[K,V]类型的,然后会
将K去掉,并且返回给sc一个会包含V的RDD。
·接下来的flatMap又会生成一个RDD,在flatMap源码中,将每一个分区(迭代器)调用scala原生的flatMap
方法。
·接下来的map又会生成一个RDD,在map方法底层,会将每一个分区(迭代器)调用scala原生的map方法
·reduceByKey也生成一个RDD
·saveAsTextFile也会生成一个RDD
所以总共会生成6个RDD