RDD的创建 -Java

集合并行化创建RDD

任务描述

本关任务:计算并输出各个学生的总成绩。

相关知识

为了完成本关任务,你需要掌握:1.集合并行化创建RDD,2.reduceByKey

集合创建RDD

Spark会将集合中的数据拷贝到集群上去,形成一个分布式的数据集合,也就是一个RDD。相当于是,集合中的部分数据会到一个节点上,而另一部分数据会到其他节点上。然后就可以用并行的方式来操作这个分布式数据集合,即RDD

  1. ArrayList<Integer> list = new ArrayList<Integer>();
  2. list.add(1);
  3. list.add(2);
  4. list.add(3);
  5. JavaRDD<Integer> rdd = sc.parallelize(list,3);//参数1:Seq集合,必须。参数2:分区数,默认为该Application分配到的资源的CPU核数
  6. Integer sum = rdd.reduce((a, b) -> a + b);
  7. System.out.print(sum);

输出:6

reduceByKey()

对元素为RDD[K,V]对的RDDKey相同的元素的Value进行聚合。

  1. List<Tuple2<String,Integer>> list = Arrays.asList(new Tuple2("hive",2),new Tuple2("spark",4),new Tuple2("hive",1));
  2. JavaPairRDD<String, Integer> listRDD = sc.parallelizePairs(list);
  3. List<Tuple2<String, Integer>> result = listRDD.reduceByKey((x, y) -> x + y).collect();

输出: (spark,4) (hive,3)

collect() :以数组的形式返回RDD中的所有元素,收集分布在各个worker的数据到driver节点。

编程要求

根据提示,在右侧编辑器begin-end处补充代码,计算并输出各个学生的总成绩。

  • ("bj",88): bj指学生姓名,88指学生成绩。
测试说明

平台会对你编写的代码进行测试:

预期输出: (bj,254) (sh,221) (gz,285)

package step1;

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 scala.Tuple2;

import java.util.*;

public class JStudent {

    public static void main(String[] args) {

        SparkConf conf = new SparkConf().setMaster("local").setAppName("JStudent");

        JavaSparkContext sc = new JavaSparkContext(conf);

        List<Tuple2<String,Integer>> list = Arrays.asList(

                new Tuple2("bj",88),new Tuple2("sh",67),new Tuple2("gz",92),

                new Tuple2("bj",94),new Tuple2("sh",85),new Tuple2("gz",95),

                new Tuple2("bj",72),new Tuple2("sh",69),new Tuple2("gz",98));

        /********** Begin **********/

        //第一步:创建RDD

        JavaPairRDD<String,Integer> listRDD=sc.parallelizePairs(list);

        //第二步:把相同key的进行聚合

        List<Tuple2<String,Integer>> collection = listRDD.reduceByKey((x , y) -> x + y).collect();

        //第三步:输出

        for(Tuple2 c:collection){

            System.out.println(c);

        }

        /********** End **********/

        sc.stop();

    }

}

读取外部数据集创建RDD 

任务描述

本关任务:读取文本文件,按照文本中数据,输出老师及其出现次数。

相关知识

为了完成本关任务,你需要掌握:1.读取文件创建RDD,2.本关所需算子。

读取文件

textFile()

  1. JavaRDD<String> rdd = sc.textFile("/home/student.txt")//文件路径
算子

(1)mapToPair:此函数会对一个RDD中的每个元素调用f函数,其中原来RDD中的每一个元素都是T类型的,调用f函数后会进行一定的操作把每个元素都转换成一个<K2,V2>类型的对象

  1. ArrayList<Integer> list = new ArrayList<Integer>();
  2. list.add(1);
  3. list.add(2);
  4. list.add(3);
  5. JavaRDD<Integer> rdd = sc.parallelize(list);
  6. JavaPairRDD<Integer,String> result = rdd.mapToPair(x -> new Tuple2(x,1)

输出:(1,1)(2,1)(3,1)

(2) reduceByKey() :对元素为RDD[K,V]对的RDDKey相同的元素的Value进行聚合

  1. List<Tuple2<String,Integer>> list = Arrays.asList(new Tuple2("hive",2),new Tuple2("spark",4),new Tuple2("hive",1));
  2. JavaPairRDD<String, Integer> listRDD = sc.parallelizePairs(list);
  3. List<Tuple2<String, Integer>> result = listRDD.reduceByKey((x, y) -> x + y).collect();

输出: (spark,5) (hive,3)

编程要求

根据提示,在右侧编辑器begin-end处补充代码,输出老师姓名和出现次数。

  • 输入文件样例:

bigdata,laozhang bigdata,laoduan javaee,xiaoxu

bigdata指科目,laozhang指老师名称。

测试说明

平台会对你编写的代码进行测试:

预期输出: (laoliu,1) (laoli,3) (laoduan,5) (laozhang,2) (laozhao,15) (laoyang,9) (xiaoxu,4)

package step2;

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 scala.Tuple2;

import java.util.Arrays;

import java.util.List;

public class JTeachers {

    public static void main(String[] args) {

        SparkConf conf = new SparkConf().setMaster("local").setAppName("JTeachers");

        JavaSparkContext sc = new JavaSparkContext(conf);

        String dataFile = "file:///root/step2_files";

        /********** Begin **********/

        //第一步:以外部文件方式创建RDD

        JavaRDD<String> teaRDD = sc.textFile(dataFile);

        //第二步:将文件中每行的数据切分,得到自己想要的返回值

        Integer one=1;

        JavaPairRDD<String, Integer> teacher = teaRDD.mapToPair(line ->{

            String name=line.split(",")[1];

            Tuple2<String, Integer > t2=new Tuple2<>(name,1);

            return t2;

        });

        //第三步:将相同的key进行聚合

        List<Tuple2<String, Integer>> collection =teacher.reduceByKey((x, y) -> x + y).collect();

        //第四步:将结果收集起来

        //第五步:输出

        for(Tuple2 c:collection){

            System.out.println(c);

            };

        /********** End **********/

        sc.stop();

    }

}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值