目录
RDD与算子
简介
RDD(Redilient Distrobuted Dataset) 是Spark的计算模型,叫做弹性的分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变,只读的,被分区的数据集,在编码时,操作RDD就像是操作本地集合一样,有很多方法可以调用,方便实用,无需关心底层的调度细节。
创建RDD
//获取session,Spark2.0之后出现的
val session = SparkSession.builder()
//指定master为localhost
.master("local[8]")
//指定Application的名字
.appName("wordCount")
.getOrCreate()
//获取SparkContext
val spark = session.sparkContext
集合并行化
//制作一个数据集
val datas = Seq("java,python","java,scala","c#,c++,c++","python,java","scala,scala")
//制作rdd
val dataRdd: RDD[String] = spark.makeRDD(datas)
或者
//制作一个数据集
val datas = Seq("java,python","java,scala","c#,c++,c++","python,java","scala,scala")
//制作rdd
val dataRdd: RDD[String] = spark.parallelize(datas)
外部文件系统创建
从hdfs中获取数据:
val wordRdd: RDD[String] = spark.textFile("hdfs://hdp01:9000/test/word.txt")
从本地获取数据:
val wordRdd: RDD[String] = spark.textFile("D:\\app\\sxgjhsdn\\test\\word.txt")
父类RDD转换成新的子RDD
val wordRdd: RDD[String] = spark.textFile("hdfs://hdp01:9000/test/word.txt")
//切分wordRdd的内容
val splitRdd: RDD[String] = wordRdd.flatMap(_.split(","))
RDD的属性
Internally, each RDD is characterized by five main properties:
在内部,每个RDD具有五个主要的特征
- A list of partitions
- 一个分区的列表
- A function for computing each split
- 一个计算每个分区的函数
- A list of dependencies on other RDDs
- 一个依赖关系列表
- Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
- 可选的,一个关于key-value类型RDD的分区器
- Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
- 可选的,计算每个分片的首选位置(例如:HDFS文件的块位置)
- 一个分区列表,即数据集的基本组成单位,对于RDD来说,每个分区都会被一个计算任务处理,并决定计算的粒度。
- 一个计算每个分区的函数,Spark中的RDD的计算是以分区为单位的,计算函数负责的是父RDD分区数据到子RDD分区数据的逻辑变换。{选择性学习:从某种意义上来说,对于没有持久化的RDD,compute方法实现了以来练的递归调用(computer->firstParent.iterator->compute)}
- RDD之间的依赖关系列表。RDD的每一次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系,在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。这个依赖关系可大体分为宽依赖、窄依赖。
- 一个partitioner,即RDD的分区函数。当前Spark实现了两种类型的分区函数,一类是基于hash的HashPartitioner,另外一个是基于范围的RangePartitioner。只有对于key-value的RDD才会有parti