spark中RDD相关操作
transformation 算子(转换算子)
- map(func) 返回一个新的RDD,该RDD由每一个输入元素经过函数转换后组成。
2.flatMap(func) 将原来RDD中的每个元素通过函数转换为新的元素,并将生成的RDD的
每个集合中的元素合并为一个集合。flatMap对每个元素处理之后,得到的每个小的集合中
的元素合并为一个大集合。这里可以理解为:flatMap就是先进行map,然后再合并为一个大的集合。
- filter(func) 返回一个新的RDD,该RDD由经过func函数计算后返回值为true的输入元素组成。
contains() 包含,,,
4、reduceByKey(func)在一个(K,V)的RDD上调用,返回一个(K,V)的RDD,使用指定的函数,
将相同key的值聚合到一起 ,,,,,其中聚合是相加的意思,,,,,
5、groupByKey对每个相同的key执行聚合操作,针对key生成的value是一个集合。
6、sortByKey([ascending])在一个(K,V)的RDD上调用,K必须实现Ordered接口,
返回一个按照key进行排序的(K,V)的RDD。
7、 sortBy 根据func的结果进行排序 scala> val rdd = sc.parallelize(List(2, 1, 4, 3))
dd.sortBy(x => x).collect() res11: Array[Int] = Array(1, 2, 3, 4)
rdd.sortBy(x => x%3).collect() res12: Array[Int] = Array(3, 4, 1, 2)
8、join(otherDataset)在类型为(K,V)和(K,W)的RDD上调用,返回一个
相同key对应的所有元素对在一起的(K,(V,W))的RDD。
9、 union(otherDataset) 对源RDD和参数RDD求并集后返回一个新的RDD。 rdd1.union(rdd2).collect
10、 distinct() 对源RDD进行去重后返回一个新的RDD。
11、cartesian(otherDataset) 笛卡尔积
12、pipe(command) 对于每个分区,都执行一个perl或者shell脚本,返回输出的RDD。
rdd.pipe("/pipe.sh").collect()
13、 coalesce(numPartitions) 缩减分区数,用于大数据集过滤后,提高小数据集的执行效率。
14、 mapValues 针对于(K,V)形式的类型只对V进行操作。
15、subtract subtract:减去,这里其实应该是 subtractSame,减去重复的。
前面的RDD去除和方法中的RDD相同的元素
Transforamation Partition 算子:
1、mapPartitions(func)
类似于map,但独立地在RDD的每一个分片上运行,因此在类型为T的RDD上运行时,
func的函数类型必须是Iterator[T] => Iterator[U]。
假设有N个元素,有M个分区,那么map的函数的将被调用N次,
而mapPartitions被调用M次,一个函数一次处理一个分区内的所有数据。
map和MapPartitions的主要区别:
map是对rdd中的每一个元素进行操作;
mapPartitions则是对rdd中的每个分区的迭代器进行操作,迭代器对一个分区内的数据进行迭代访问。
2、mapPartitionsWithIndex(func)
类似于mapPartitions,比 mapPartitions多了一个参数,把第一个参数用来表示分区的索引值,
rdd.mapPartitionsWithIndex((index, elements)
3、aggregate(value)(seqOp, combOp)
aggregate其实是action算子,把它放在这里是因为下面讲到的 aggregateByKey。
aggregate其实和reduce类似,都是对每个元素进行聚合,只是多了一个初始值,以及对每个分区进行聚合。
rdd4.aggregate(1)(_ + _, _ + _)
aggregate内的参数表示初始值,还包括两个函数,第一个函数是对每个分区内的元素进行聚合;
第二个函数是对每个分区聚合后的结果,进行聚合
4、rdd.reduce((x, y) => x + y)
对于这个x,它代指的是函数返回值,而y是对rdd各元素的遍历。
5、aggregateByKey(value)(seqOp, combOp)
和 aggregate 相比,是针对键值对的操作。
将每个分区里面的元素通过seqOp和初始值进行聚合,然后将每个分区的结果进行combine操作。
(这里注意一点,和aggregate不同的是,再combine时不把初始值包含进去)
6、combineByKey 和aggregateByKey是相同的效果,只不过aggregateByKey是指定一个初始值,
而 combineByKey是通过一个函数来指定初始值
def combineByKey[C]
(createCombiner: V => C,mergeValue: (C, V) => C,mergeCombiners: (C, C) => C)
rdd2.combineByKey(x => x, (a: Int, b: Int) => a + b,(m: Int, n: Int) => m + n)
7、combineByKey 和 aggregateByKey 的区别
这两者有什么区别呢?细细观察,这两者是很相似的,都是先对每个分区相同的 K 进行聚合,
然后把每个分区聚合的结果再聚合。不同点是初始值不一样,aggregateByKey 是手动指定一个初始值;
而 combineByKey 是把第一个K出现的 value 指定一个 func,转换后的数据作为初始值。
action 算子:
- collect() 在驱动程序中,以数组的形式返回数据集的所有元素。
2.reduce(func) 通过func函数聚集RDD中的所有元素
- count() 返回RDD的元素个数。
4、 first() 返回RDD的第一个元素
5、take(n) 返回一个由数据集的前n个元素组成的数组。
6、takeOrdered(n) 返回前几个的排序。//takeOrdered 从小到大取前n个// top 从大到小取前n个
7、***** aggregate(value)(seqOp, combOp) aggregate函数将每个分区里面的元素
通过seqOp和初始值进行聚合,然后用combine函数将每个分区的结果和初始值(zeroValue)
进行combine操作。这个函数最终返回的类型不需要和RDD中元素类型一致。
8、 fold(num)(func) aggregate的简化操作,只有一个函数,对所有元素聚合。
和reduce的区别是 多了一个初始值
9、saveAsTextFile(path) 将数据集的元素以textfile的形式保存到HDFS文件系统
或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,
将它装换为文件中的文本。
10、countByKey()针对(K,V)类型的RDD,返回一个(K,Int)的map,表示每一个key对应的元素个数。
11、foreach(func) 在数据集的每一个元素上,运行函数func。和map的区别是,
foreach没返回值,map返回RDD
12、count mean() sum() max() min()
rdd中元素的个数 元素平均值 总和 最大值 最小值
List知识带你
1、
:+ 追加一个元素到 list 尾部,++ 合并两个list
List(_) 其实就是 x => List(x)