Spark -Core 之---Transformation 的转化算子

Spark 的核心函数value类型

1.map 函数:

遍历RDD 中的每一个元素。

package com.wudl.core
import org.apache.spark.{SparkConf, SparkContext}
/**
 * 函数模型:
 *          def map[U:ClassTag](f.T =>U): RDD[U]
 *  功能说明:
 *            参数是一个函数,当rdd 需要执行map 的时候 ,会遍历该rdd中的每一个数据项,并
 *            依次执行f 函数, 从而产生一个新的函数,即这个新的rdd中的每一个元素都是原来rdd中
 *            每个元素依次应用f 函数而得到。
 */
object SparkMap {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("SparkMap");
    val sc = new SparkContext(conf)
    val rdd = sc.makeRDD(1 to (4), 2)
    val mapRdd = rdd.map(_ * 2)
    mapRdd.collect().foreach(println)
    sc.stop()
  }
}

2.mapPartitions 就是一分区为单位的执行map

实例:

package com.wudl.core
import org.apache.spark.{SparkConf, SparkContext}
/**
 * MapPartions 一次只处理一个分区的数是一批 一批的数据,而map 是一次处理一个元素
 */
object SparkMapPartitions {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[1]").setAppName("SparkMapPartitions")
    val sc = new SparkContext(conf)
    val rdd = sc.makeRDD(1 to (4), 2)
    val mapParRdd = rdd.mapPartitions(x => x.map(_ * 2))
    mapParRdd.collect().foreach(println)
    sc.stop()
  }
}

3. mapParitionsWithIndex

功能说明: 类似于mapPartitions 比mapPartitions多一个整数参数表示分区号

package com.wudl.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * 功能说明: 类似于mapPartitions  比mapPartitions多一个整数参数表示分区号
 * 需求说明:创建一个RDD  使每个元素跟所在的分区号形成一个元组,组成一个新的rdd
 */
object SparkParittionWitsWithInex {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("SparkConf").setMaster("local[1]")
    val sc = new SparkContext(conf)
    val rdd: RDD[Int] = sc.makeRDD(1 to 8, 2)
    val rddmap = rdd.mapPartitionsWithIndex((index, item) => {
      item.map((index, _))
    })
    rddmap.collect().foreach(println)
    sc.stop()
  }
}

执行的结果:

(0,1)
(0,2)
(1,3)
(1,4)

4. flatMap

将Rdd 中的每一个元素通过应用的函数, 转化为新的元素,并封装到新RDD 中。

package com.wudl.core
import org.apache.spark.{SparkConf, SparkContext}
/**
 * 将Rdd 中的每一个元素通过应用的函数, 转化为新的元素,并封装到新RDD 中
 */
object SparkFlatMap {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("SparkFlatMap")
    val sc = new SparkContext(conf)
    //  创建一个Rdd
    val rdd = sc.makeRDD(List(List(1, 2), List(3, 4), List(5, 6)))
    rdd.flatMap(list => list).collect().foreach(println)
    sc.stop()
  }
}

5.glom 分区内转化数组

package com.wudl.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object SparkGlom {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("SparkGlom").setMaster("local[1]")
    val sc = new SparkContext(conf)
    val rdd: RDD[Int] = sc.makeRDD(1 to 6, 2)
    val rddMax: RDD[Int] = rdd.glom().map(_.max)
    rddMax.foreach(println)
    println("---------------------")
    println(rddMax.collect().sum)
    sc.stop()
  }
}

6. groupBy

解释:
1.将数据根据指定的规则进行分组, 分区默认不变,但是数据会被打乱重新组合,我们将这样的操作称之为shuffle
2.	一个组的数据在一个分区中,但是并不是说一个分区中只有一个组
object SparkRddMake {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[1]").setAppName("sparkRddMake")
    val sc = new SparkContext(sparkConf)
    val dataRdd = sc.makeRDD(List(1, 8, 3, 4, 5))
    val resultRDD = dataRdd.groupBy(_%2)
    resultRDD.foreach(println)
    sc.stop()
  }
}
//打印的 结果为
(0,CompactBuffer(8, 4))
(1,CompactBuffer(1, 3, 5))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值