spark学习笔记1 spark算子

 1、map和flatMap的区别

Spark 中 map函数会对每一条输入进行指定的操作,然后为每一条输入返回一个对象。而flatMap函数则是两个操作的集合——正是“先映射后扁平化”:

   操作1:同map函数一样:对每一条输入进行指定的操作,然后为每一条输入返回一个对象

   操作2:最后将所有对象合并为一个对象

2、mapPartitions

该函数和map函数类似,只不过映射函数的参数由RDD中的每一个元素变成了RDD中每一个分区的迭代器。如果在映射的过程中需要频繁创建额外的对象,使用mapPartitions要比map高效的过。

两者的主要区别是调用的粒度不一样:map的输入变换函数是应用于RDD中每个元素,而mapPartitions的输入函数是应用于每个分区。

scala> val a = sc.parallelize(1 to 9, 3)
scala> val b = a.map(x => x*2)
scala> a.collect
res10: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
scala> b.collect
res11: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18)
scala> val a = sc.parallelize(1 to 9, 3)
scala> def myfunc[T](iter: Iterator[T]) : Iterator[(T, T)] = {
    var res = List[(T, T)]() 
    var pre = iter.next while (iter.hasNext) {
        val cur = iter.next; 
        res .::= (pre, cur) pre = cur;
    } 
    res.iterator
}
scala> a.mapPartitions(myfunc).collect
res0: Array[(Int, Int)] = Array((2,3), (1,2), (5,6), (4,5), (8,9), (7,8))
map就是把分区内的每个元素分开传入,而mapPartitions则是把一个分区全部传入,代码的结果是相同的,只是节约了传入数据的损耗。
所以,这两个方法的一个区别是在大数据集情况下的资源初始化开销和批处理处理,比如在数据库连接。在上面的例子中,mapPartition只需初始化3个资源(3个分区每个1次),而map要初始化10次(10个元素每个1次)。在大数据集情况下(数据集中元素个数远大于分区数)mapPartitons的开销要小很多,也便于进行批处理操作。
3、glom
将每一个分区内的元素整合在一个数组中。
4、union intersection subtract
该函数返回两个RDD的交集,并且不去重
该函数返回两个RDD的交集,并且去重
该函数类似于intersection,但返回在RDD中出现,并且不在otherRDD中出现的元素,不去重。参数含义同intersection
在保证数据类型相同的情况下,返回合并后的数据集。不进行去重操作,但可以通过distinct()去重
5、cartesian
两个rdd形成笛卡尔集,新的rdd的分区数为旧的之积
6、groupBy
按照key值分类成组
7、filter
满足条件的保留,比如
x.filter(a=>a.contains("-")==false)
8、distinct()
去重
9、sample takeSample
sample(withReplacement,fraction, seed)	第一个参数withReplacementtrue表示有放回取样,false表示无放回。第二个参数表示比例,第三个参数是随机种子。如data.sample(true, 0.3,new Random().nextInt())
10、Cache。将RDD缓存到内存中。相当于persist(MEMORY_ONLY)。可以通过参数设置缓存和运行内存之间的比例,如果数据量大于cache内存则会丢失。
Persist。里面参数可以选择DISK_ONLY/MEMORY_ONLY/MEMORY_AND_DISK等,其中的MEMORY_AND_DISK当缓存空间满了后自动溢出到磁盘。
11、mapValues
针对(key,value)中的数据value进行map操作,而不对key操作
12、combineByKey
combineByKey属于Key-Value型算子,做的是聚集操作,这种变换不会触发作业的提交,主要有三个参数,分别是:
combiner function : 一个组合函数,用于将RDD[K,V]中的V转换成一个新的值C1;
mergeValue function :合并值函数,将一个C1类型值和一个V类型值合并成一个C2类型,输入参数为(C1,V),输出为新的C2
mergeCombiners function :合并组合器函数,用于将两个C2类型值合并成一个C3类型,输入参数为(C2,C2),输出为新的C3
scala> var rdd1 = sc.makeRDD(Array(("A",1),("A",2),("B",1),("B",2),("C",1)))
rdd1: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[64] at makeRDD at :21
 
scala> rdd1.combineByKey(
     |       (v : Int) => v + "_",   
     |       (c : String, v : Int) => c + "@" + v,  
     |       (c1 : String, c2 : String) => c1 + "$" + c2
     |     ).collect
res60: Array[(String, String)] = Array((A,2_$1_), (B,1_$2_), (C,1_))

outInfo.combineByKey(
  (v) => (1, v),
  (acc: (Int, String), v) => (acc._1 + 1, acc._2),
  (acc1: (Int, String), acc2: (Int, String)) => (acc1._1 + acc2._1, acc2._2)
).sortBy(_._2, false).map{
  case (key, (key1, value)) => Array(key, key1.toString, value).mkString("\t")
}.saveAsTextFile("/out")
点击打开链接
13、reduceByKey
针对KV数据将相同keyvalue聚合到一起。与groupByKey不同,会进行一个类似mapreduce中的combine操作,减少相应的数据IO操作,加快效率。如果想进行一些非叠加操作,我们可以将value组合成字符串或其他格式将相同keyvalue组合在一起,再通过迭代,组合的数据拆开操作。
14、
15、Cogroup。对两个RDD中的KV元素,每个RDD中相同key中的元素分别聚合成一个集合。与reduceByKey不同的是针对两个RDD中相同的key的元素进行合并。

action算子

1、无输出   foreach
2、输出到HDFS http://lxw1234.com/archives/2015/07/402.htm
3、collect,collectAsMap
collect将分布式的rdd返回为一个单机的scala array 数组。
collectAsMap
scala> val data = sc.parallelize(List((1, "www"), (1, "iteblog"), (1, "com"), 
    (2, "bbs"), (2, "iteblog"), (2, "com"), (3, "good")))
data: org.apache.spark.rdd.RDD[(Int, String)] =
    ParallelCollectionRDD[26] at parallelize at <console>:12
 
scala> data.collectAsMap
res28: scala.collection.Map[Int,String] = Map(2 -> com, 1 -> com, 3 -> good)
4、count
5、top(num:int)
top:最大的k个元素
take:最小的k个元素
takeOrdered:返回并保存元素顺序
first:top(1)
6、reduce
将RDD中元素两两传递给输入函数,同时产生一个新的值,新产生的值与RDD中下一个元素再被传递给输入函数直到最后只有一个值为止。

举例 scala> val c = sc.parallelize(1 to 10) scala> c.reduce((x, y) => x + y) res4: Int = 55 上述例子对RDD中的元素求和。

7、fold aggregate

http://www.cnblogs.com/sharpxiajun/p/5513612.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章