行动算子 java和scala示例代码

22 篇文章 0 订阅
本文深入解析了Apache Spark中关键的行动操作,包括reduce、collect、count、take、saveAsTextFile、countByKey和foreach,详细介绍了这些操作的功能、应用场景及其实现原理。
摘要由CSDN通过智能技术生成

Java代码

package com.netcloud.spark.sparkcore.action;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function2;
import scala.Tuple2;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * reduce:对RDD中的每个元素按照指定的逻辑进行聚合(通常进行累加)
 * collect:将远程集群中RDD中所有的数据元素返回发Driver端
 * count:统计RDD中元素的个数
 * take:从远程集群中获取RDD前n条数据
 * savaAsTextFile:将RDD元素保存到本地文件或者hdfs中
 * countByKey:统计相同key 出现的次数
 * forearach:在远程集群中遍历元素
 *
 * @author yangshaojun
 * #date  2019/3/10 11:34
 * @version 1.0
 */
public class ActionPractice {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("ActionPractice").setMaster("local[2]");
        JavaSparkContext sc = new JavaSparkContext(conf);
        //reduce(sc);
        //collect(sc);
        //count(sc);
        //take(sc);
        //savaAsTextFile(sc);
        countByKey(sc);
        sc.stop();
    }

    /**
     * reduce:将RDD中的每个元素按照指定的聚合逻辑进行聚合
     *
     * @param sc
     */
    public static void reduce(JavaSparkContext sc) {

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        JavaRDD<Integer> numRDD = sc.parallelize(list);
        /**
         * 使用reduce将集合中的元素累加
         * reduce操作原理:
         * 首先将第一个和第二个元素传入 call()方法进行计算,会获取一个结果 比如 1+2=3
         * 接着 将该结果与下一个元素传入 call()方法进行计算 不让 3+3=6 以此类推
         * 所有reduce操作的本质就是聚合,将多个元素聚合成一个元素
         *
         */
        int sum = numRDD.reduce(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        });
        System.out.println(sum);

    }

    /**
     * collect:将远程集群中RDD中所有的数据元素返回发哦Driver端
     * 这种方式不建议使用 当数据量太大会造成内存溢出还有就是大量的网络传输,使性能变差
     *
     * @param sc
     */
    public static void collect(JavaSparkContext sc) {

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        JavaRDD<Integer> numRDD = sc.parallelize(list);

        List<Integer> ret = numRDD.collect();
        for (Integer num : ret) {
            System.out.println(num);
        }

    }

    /**
     * count:统计rdd中数据元素数目
     *
     * @param sc
     */
    public static void count(JavaSparkContext sc) {

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        JavaRDD<Integer> numRDD = sc.parallelize(list);
        Long ret = numRDD.count();
        System.out.println(ret);
    }

    /**
     * take:统计rdd中前n条数据
     *
     * @param sc
     */
    public static void take(JavaSparkContext sc) {

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        JavaRDD<Integer> numRDD = sc.parallelize(list);
        List<Integer> ret = numRDD.take(2);
        System.out.println(ret);
    }

    /**
     * savaAsTextFile:将RDD中的元素保存到本地文件或者hdfs文件中。
     *
     * @param sc
     */
    public static void savaAsTextFile(JavaSparkContext sc) {

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        JavaRDD<Integer> numRDD = sc.parallelize(list);
        numRDD.saveAsTextFile("data/result");
    }

    /**
     * countByKey:统计相同key 出现的次数
     *
     * @param sc
     */
    public static void countByKey(JavaSparkContext sc) {

        List<Tuple2<String, Integer>> list = Arrays.asList(new Tuple2("tome", 100), new Tuple2("tome", 200), new Tuple2("jack", 200), new Tuple2("marry", 10));
        JavaPairRDD<String, Integer> numRDD = sc.parallelizePairs(list);
        Map map = numRDD.countByKey();
        System.out.println(numRDD.countByKey());
        /**
         * {tome=2, marry=1, jack=1}
         */
    }
}

 

Scala代码

package com.netcloud.bigdata.spark_core.basiclearning.action

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

/**
  * reduce:将RDD中的每个元素按照指定的逻辑进行聚合
  * collect:将远程集群所有RDD的元素返回给Driver端 这种方式不建议使用(数据量太大造成内存溢出)
  *          通常还是建议使用 foreach action操作将rdd进行处理
  * count:统计RDD中元素的个数
  * take:从远程集群中获取RDD前n条数据
  * saveAsTextFile:将RDD元素保存到本地文件或者hdfs中
  * countByKey:统计相同key 出现的次数
  * forearach:在远程集群中遍历元素
  * @author yangshaojun
  * #date  2019/3/10 11:48
  * @version 1.0
  */
object Action_008_ActionPractice {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setMaster("local").setAppName("ActionPractice")
    val sc = new SparkContext(conf)
    //    reduce(sc)
    //    collect(sc)
    //    count(sc)
    take(sc)
    sc.stop()
  }

  def reduce(sc: SparkContext): Unit = {
    val c = sc.parallelize(1 to 10)
    val result = c.reduce((x, y) => {
      x + y
    }) //结果55
    println(result)
  }

  def collect(sc: SparkContext): Unit = {
    val c = sc.parallelize(1 to 10)
    val result = c.collect()
    for (ret <- result) {
      println(ret)
    }
  }

  def count(sc: SparkContext): Unit = {
    val c = sc.parallelize(1 to 10)
    val result = c.count()
    println(result)

  }

  def take(sc: SparkContext): Unit = {
    val c = sc.parallelize(1 to 10)
    val result = c.take(2)
    println(result)
  }

  def saveAsTextFile(sc: SparkContext): Unit = {
    val c = sc.parallelize(1 to 10)
    c.saveAsTextFile("data/result")
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值