Spark Action操作

来源:互联网 发布:赚钱最快的方法 知乎 编辑:程序博客网 时间:2024/06/05 23:54

集合标量行动操作:

  • first():T 表示返回RDD中的第一个元素,不排序
  • count():Long 表示返回RDD中的元素个数
  • reduce(f:(T,T)=>T):T 根据映射函数f,对RDD中的元素进行二元计算
  • collect():Array[T] 表示将RDD转换成数组。
  • take(num:Int):Array[T] 表示获取RDD中从0到num-1下标的元素,不排序。
  • top(num:Int):Array[T] 表示从RDD中,按照默认(降序)或者指定的排序规则,返回前num个元素。排序。
  • takeOrdered(num:Int):Array[T]和top类似,只不过以和top相反的顺序返回元素。
  • aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U用户聚合RDD中的元素,先使用seqOp将RDD中每个分区中的T类型元素聚合成U类型,在使用comOp将之前每个分区聚合后的U类型聚合成U类型,特别注意seqOP和comOP都会使用zeroValue的值。
  • fold(zeroValue: T)(op: (T, T) => T): T fold是aggregate的简化,将aggregate中的seqOp和combOp合并成一个函数op。
 val rdd5 = sc.parallelize(1 to 10, 2)    rdd5.mapPartitionsWithIndex(      (partIdx, iter) => {        var part_map = scala.collection.mutable.Map[String, List[Int]]()        while (iter.hasNext) {          var part_name = "part_" + partIdx          var elem = iter.next()          if (part_map.contains(part_name)) {            var elems = part_map(part_name)            elems ::= elem            part_map(part_name) = elems          } else {            part_map(part_name) = List[Int] {              elem            }          }        }        part_map.iterator      }    ).collect()    // Array[(String, List[Int])] = Array((part_0,List(5, 4, 3, 2, 1)), (part_1,List(10, 9, 8, 7, 6)))    /**      * def aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U      * 计算过程:先在每个分区中迭代执行 (x: Int, y: Int) => x + y,并且使用zeroValue的值,      * 即part_0中:zeroValue+5+4+3+2+1      * 即part_1中:zeroValue+10+9+8+7+6      * 再将两个分区的结果使用(a: Int, b: Int) => a + b进行合并,并且也是要zeroValue      * 即 zeroValue+part_0+part_1      */    rdd5.aggregate(0)(      { (x: Int, y: Int) => x + y }, { (a: Int, b: Int) => a + b }    )    //res23: Int = 55

 rdd5.fold(0)(      (x, y) => x + y    )    //res24: Int = 55