一.RDD介绍
(1)RDD介绍
RDD全称resilient distributed dataset(弹性分布式数据集)。他是一个弹性分布式数据集,是spark里面抽象的概念。代表的是一个不可变的,集合里面的元素可以分区的支持并行化的操作。
(2)源码描述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)
- Optionally, a list of preferred locations to compute each split on (e.g. block locations for
an HDFS file)
(3)五大特性对应的方法
1)A list of partitions 一系列的partition
protected def getPartitions: Array[Partition]
2)A function for computing each split 针对RDD做操作其实就是针对RDD底层的partition进行操作
rdd.map(_*2)
def compute(split: Partition, context: TaskContext): Iterator[T]
3)A list of dependencies on other RDDs rdd之间的依赖
protected def getDependencies: Seq[Dependency[_]] = deps
4)Optionally, a Partitioner for key-value RDDs partitioner rdd的分片函数
@transient val partitioner: Option[Partitioner] = None
5)Optionally, a list of preferred locations to compute each split on locations
protected def getPreferredLocations(split: Partition): Seq[String] = Nil
二、开发spark应用程序
1)SparkConf需要设置
appName
master
2)SparkContext(sparkConf)
3)spark-shell 启动时,使用master设置
–master local[2] 底层自动为我们创建了SparkContext
三、RDD创建方式
1)parallelize 适用于测试
2)External Datasets 生产
3)通过已有RDD转换过来的 生产
1)parallelize
scala> val rdd = sc.parallelize(List(1,2,3,4,5))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24
scala> rdd.collect
res0: Array[Int] = Array(1, 2, 3, 4, 5)
2)External Datasets
scala> val rdd = sc.textFile("file:///home/hadoop/data/wc.data")
3)通过已有RDD转换过来的
scala> val rdd1 = rdd.map(_*2)
四、RDD操作
transformation 转换
action 动作 触发 SparkContext 提交 作业
transformation将一个RDD转换成另一个RDD并不会立即执行,只有遇到action才会提交作业开始执行计算
举例:
transformation
- map:对数据集的每一个元素进行操作
- mapPartitions: 对每个分区进行处理
- mapValues 是针对RDD[K,V]的V做处理
- FlatMap:先对数据集进行扁平化处理,然后再Map
- Filter:对数据进行过滤,为true则通过
- destinct:去重操作
action
- reduce:对数据进行聚集
- reduceBykey:对key值相同的进行操作
- collect:没有效果的action,但是很有用
- saveAstextFile:数据存入文件系统
- foreach:对每个元素进行func的操作
rdd.mappartitions(_*2)是错误的
map是对每一条数据做处理的,mappartitions对分区的数据做处理的,分区内是有很多个int元素,是一个迭代的int
假如有100个元素 10个分区 作用于map和mapPartitions==> 知识点:要把RDD的数据写入MySQL Connection