目录
3.1.7.groupBy,groupByKey,reduceByKey
3.1.9union,intersection,subtract
1.RDD简述
RDD是spark中的基本的抽象的计算模型。
RDD( Resilient Distributed Dataset) 弹性分布式的数据集。
弹性: 容错的概念。
分布式: 分区的概念。不同的分区中的数据,可能运行在不同机器上。
数据集合: 存储数据。
不可变,只读的,被分区的数据集。
类似于scala的本地集合,有很多的方法可以调用。操作起来和本地集合一样。
RDD还有5大特性。
2.Rdd的创建
创建rdd有3种方式:
2.1集合并行化
该方法是将本地集合(Seq)转化成rdd,多用于测试时使用
scala> val arr = Array(List(1,3),List(4,6)) arr: Array[List[Int]] = Array(List(1, 3), List(4, 6))
scala> val rdd2 = sc.makeRDD(arr) rdd2: org.apache.spark.rdd.RDD[List[Int]] = ParallelCollectionRDD[2] at makeRDD at <console>:26 scala> val rdd3 = sc.parallelize(arr) |
2.2读取外部文件系统
这是实际中最常用的方法,可以读hdfs文件,也可以读取本地文件
sc.textFile(“”)
2.3调用转换类的算子
只要调用transformation类的算子,都会生成一个新的RDD
RDD中的数据类型,由传入给算子的函数的返回值类型决定
val file: RDD[String] = sc.textFile(input) |
强调: action类的算子,不会生成rdd。
3.Rdd的算子
rdd的算子主要分为两大类,transformation和action
其中,转换类的算子transformation会生成新的rdd,是lazy执行的,只有遇到ac才能被执行
行动类的算子action会立即触发任务的执行,不会生成rdd
3.1.Transformation
3.1.1.map
map是一一映射,对某一个rdd执行map,rdd有几条数据,就会被迭代执行几次
map的返回值的数据类型,取决于传递的函数的返回值类型
rdd的分区数量,是不变的
scala> val rdd1 = sc.makeRDD(List(1,4,2,5,7,8),3) rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at makeRDD at <console>:24
scala> val rdd2 = rdd1.map(_>5) rdd2: org.apache.spark.rdd.RDD[Boolean] = MapPartitionsRDD[1] at map at <console>:26
scala> rdd2.collect [Stage 0:> (0 + 0) / res1: Array[Boolean] = Array(false, false, false, false, true, true)
scala> rdd1.partitions.size res2: Int = 3
scala> rdd2.partitions.size res3: Int = 3 |
类似于map,作用于RDD[k,v]中的v。key保持不变
mapValues得到的rdd的分区数量是不变的
scala> val rdd = sc.makeRDD(List(("reba",100),("fengjie",80))) rdd: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[2] at makeRDD at <console>:24
scala> rdd.mapValues(_*100) res4: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[3] at mapValues at <console>:27 scala> val rdd3 = rdd.mapValues(((t:Int)=> t*100)) rdd3: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[4] at mapValues at <console>:26
scala> rdd3.collect res5: Array[(String, Int)] = Array((reba,10000), (fengjie,8000)) |
3.1.3.mapPartitions
作用于每一个rdd的分区
传递的函数是一个迭代器
有几个分区,就会迭代几次
val conf =new SparkConf() |