Spark中非键值对中常用的行动算子

/**
 * 行动算子:返回的是一个数据值、集合或者没有返回
 */
object RDDDemo01 {
  def main(args: Array[String]): Unit = {
    val sparkConf: SparkConf = new SparkConf().setAppName("action").setMaster("local[2]")
    val sc: SparkContext = new SparkContext(sparkConf)
    reduceOper(sc)
    aggregateOper(sc)
    collectOper(sc)
    countOper(sc)
    sc.stop()
  }

  /**
   * reduce——聚合算子
   * 通过func函数聚集RDD中的所有元素,这个功能必须是可交换且可并联的
   */
  def reduceOper(sc:SparkContext):Unit = {
    val rdd:RDD[Int] = sc.makeRDD(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 0),1)
    val sum = rdd.reduce((a: Int, b: Int) => {
      println(s"a=$a,b=$b")
      a + b
    })
    val max = rdd.reduce((a: Int, b: Int) => {
      println(s"a=$a,b=$b")
      var c = 0
      if (a>b) {
        a
      } else {
        b
      }
    })

    println("最大值为:"+max)
  }

  /**
   * aggregate——聚合算子,根据初始值和每一个分区进行运算
   * first——获取RDD数据集中第一条数据
   */
  def aggregateOper(sc:SparkContext):Unit = {
    val rdd:RDD[Int] = sc.makeRDD(Array(1, 2, 3, 4, 5, 6, 7, 8, 9),4)
    val res:Int = rdd.aggregate(0)(
      (a: Int, b: Int) => {a + b},
      (a: Int, b: Int) => {a + b}
    )
    println("aggregateOper聚合算子求和:"+res)

    val max:Int = rdd.aggregate(rdd.first())(
      (a: Int, b: Int) => {
        if (a>b) {
          a
        } else {
          b
        }
      },
      (a: Int, b: Int) => {
        if (a>b) {
          a
        } else {
          b
        }
      }
    )
    println("aggregateOper聚合算子求最大值:"+max)
  }

  /**
   * collect——(慎用)将RDD数据集中的全部数据拉取到Driver所在节点形成一个数组,数组包含RDD数据集中的所有数据,数组在内存中的概念,会导致内存溢出
   * take(n)——拉取前n条数据,顺序
   * takeSample——随机抽样
   * takeOrdered——将RDD数据集中数据排序之后获取前n条数据
   */
  def collectOper(sc:SparkContext):Unit = {
    val rdd:RDD[Int] = sc.makeRDD(Array(24,54,67,23,65,32,87,23,21,11,99))
    val array:Array[Int] = rdd.collect()
    println(array.mkString(","))

    // take算子
    val array1:Array[Int] = rdd.take(5)
    println(array1.mkString("="))

    // takeSample算子
    val array2:Array[Int] = rdd.takeSample(false, 10)
    println(array2.mkString("::"))

    // takeOrdered算子
    val array3:Array[Int] = rdd.takeOrdered(5)
    println(array2.mkString("->"))
  }

  /**
   * count算子
   */
  def countOper(sc:SparkContext):Unit = {
    val rdd:RDD[Int] = sc.makeRDD(1 to 100)
    val rdd1:RDD[Int] = rdd.filter((a: Int) => {
      if (a % 2 == 1) {
        true
      } else {
        false
      }
    })
    val count:Long = rdd1.count()
    println("count="+count)

    /**
     * foreach——无返回值,累加器计算或者RDD数据集遍历
     */
    rdd1.foreach((a:Int)=>{println(a)})

  }

  /**
   * saveAsSequenceFile(path):K-V键值对RDD
   * saveAsTextFile(path):数值型RDD
   */
  def saveAsXxxFileOper(sc:SparkContext):Unit = {
    val rdd:RDD[Int] = sc.makeRDD(1 to 100)
    rdd.saveAsTextFile("hdfs://node1:9000/action")
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值