Spark-java版

SparkContext初始化

相关知识
  • SparkConf 是SparkContext的构造参数,储存着Spark相关的配置信息,且必须指定Master(比如Local)和AppName(应用名称),否则会抛出异常;
  • SparkContext 是程序执行的入口,一个SparkContext代表一个 Application
初始化过程的主要核心:
  1. 依据SparkConf创建一个Spark执行环境SparkEnv
  2. 创建并初始化Spark UI,方便用户监控,默认端口为 4040
  3. 设置Hadoop相关配置及Executor环境变量;
  4. 创建和启动TaskSchedulerDAGScheduler
初始化方式:
  1. SparkConf conf = new SparkConf().setAppName(appName).setMaster(master)
  2. JavaSparkContext sc=new JavaSparkContext(conf)

程序运行完后需使用sc.stop()关闭SparkContext
 

import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.SparkConf;
import java.util.Arrays;
import java.util.List;public class Edu {public static void main(String[] args) {/********** Begin **********///第一步:设置SparkConfSparkConf conf = new SparkConf().setAppName("educoder").setMaster("local");//第二步:初始化SparkContextJavaSparkContext sc = new JavaSparkContext(conf);/********** End **********/List<String> data = Arrays.asList("hello");JavaRDD<String> r1 = sc.parallelize(data);System.out.print(r1.collect());/********** Begin **********///第三步:关闭SparkContextsc.stop();/********** End **********/}
}

集合并行化创建RDD

任务描述

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

相关知识

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

集合创建RDD

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

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

输出:6

reduceByKey()

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

List<Tuple2<String,Integer>> list = Arrays.asList(new Tuple2("hive",2),new Tuple2("spark",4),new Tuple2("hive",1));
JavaPairRDD<String, Integer> listRDD = sc.parallelizePairs(list);
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.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));//第一步:创建RDDJavaPairRDD<String, Integer> listRDD = sc.parallelizePairs(list);//第二步:把相同key的进行聚合JavaPairRDD<String, Integer> result = listRDD.reduceByKey((x, y) -> x + y);//第三步:收集List<Tuple2<String, Integer>> collect = result.collect();//第四步:输出for (Tuple2 c:collect){System.out.println(c);}sc.stop();}
}

读取外部数据集创建RDD
 

任务描述

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

相关知识

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

读取文件

textFile()

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

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

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

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

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

List<Tuple2<String,Integer>> list = Arrays.asList(new Tuple2("hive",2),new Tuple2("spark",4),new Tuple2("hive",1));
JavaPairRDD<String, Integer> listRDD = sc.parallelizePairs(list);
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";//第一步:以外部文件方式创建RDDJavaRDD<String> teaRDD = sc.textFile(dataFile);//String name = line.split(",")[1];//第二步:将文件中每行的数据切分,得到自己想要的返回值Integer one = 1;JavaPairRDD<String, Integer> teacher = teaRDD.mapToPair(line ->{String names = line.split(",")[1];Tuple2<String, Integer> t2 = new Tuple2<>(names, one);return t2;});//第三步:将相同的key进行聚合JavaPairRDD<String, Integer> tea = teacher.reduceByKey((x, y) -> x + y);//第四步:将结果收集起来List<Tuple2<String, Integer>> result = tea.collect();//第五步:输出for (Tuple2 t:result){System.out.println(t);}sc.stop();}
}

map算子完成转换操作

相关知识

为了完成本关任务,你需要掌握:如何使用map算子。

map

将原来RDD的每个数据项通过map中的用户自定义函数f映射转变为一个新的元素。

图中每个方框表示一个RDD分区,左侧的分区经过自定义函数f:T->U映射为右侧的新RDD分区。但是,实际只有等到Action算子触发后,这个f函数才会和其他函数在一个Stage中对数据进行运算。

map 案例
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
System.out.println("init:" + list);
JavaRDD<Integer> rdd = sc.parallelize(list);
JavaRDD<Integer> map = rdd.map(x -> x * 2);
System.out.println("result :" + map.collect());

输出:

init :[1, 2, 3, 4, 5, 6] result :[2, 4, 6, 8, 10, 12]

说明:rdd1的元素(1 , 2 , 3 , 4 , 5 , 6)经过map算子(x -> x*2)转换成了rdd2(2 , 4 , 6 , 8 , 10)

编程要求

根据提示,在右侧编辑器begin-end处补充代码,完成以下需求:

需求1:使用map算子,将rdd的数据(1, 2, 3, 4, 5)按照下面的规则进行转换操作,规则如下:

  • 偶数转换成该数的平方;

  • 奇数转换成该数的立方。

需求2:使用map算子,将rdd的数据("dog", "salmon", "salmon", "rat", "elephant")按照下面的规则进行转换操作,规则如下:

  • 将字符串与该字符串的长度组合成一个元组,例如
  1. dog --> (dog,3)
  2. salmon --> (salmon,6)
    package net.educoder;
    import org.apache.spark.SparkConf;
    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 Step1 {private static SparkConf conf;private static JavaSparkContext sc;static {conf = new SparkConf().setAppName("Step1").setMaster("local");sc = new JavaSparkContext(conf);}/*** 返回JavaRDD** @return JavaRDD*/public static JavaRDD<Integer> MapRdd() {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);JavaRDD<Integer> rdd = sc.parallelize(list);/**** 需求:使用map算子,将rdd的数据进行转换操作* 规则如下:*      偶数转换成该数的平方*      奇数转换成该数的立方**//********** begin ***********/JavaRDD<Integer> map = rdd.map(num -> {if (num % 2 == 0) {return num * num;} else {return num * num * num;}});return map;/********** end ***********/}/*** 返回JavaRDD** @return JavaRDD*/public static JavaRDD<Tuple2> MapRdd2() {List<String> list = Arrays.asList("dog", "salmon", "salmon", "rat", "elephant");JavaRDD<String> rdd = sc.parallelize(list);/**** 需求:使用map算子,将rdd的数据进行转换操作* 规则如下:*      将字符串与该字符串的长度组合成一个元组,例如:dog  -->  (dog,3),salmon   -->  (salmon,6)**//********** begin ***********/JavaRDD<Tuple2> map = rdd.map(str -> {int i = str.length();return new Tuple2(str, i);});return map;/********** end ***********/}
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/230791.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目demo —— GPT 聊天机器人

本文介绍我的开源项目 TelegramChatBot&#xff0c;这是一个基于 OpenAI GPT API 开发的 telegram 机器人&#xff0c;具有多模态交互能力&#xff0c;求 star&#xff01;感谢大家&#xff01;在 telegram jokerController_bot 立即体验&#xff01;欢迎对 GPT 应用开发或对 t…

Python樱花树

系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心https://want…

数据结构-选择排序(简单选择、堆)

简单选择排序 基本思想 非常基础的算法&#xff0c;假设有N个数据&#xff0c;比较N-1轮&#xff0c;每轮选出当前剩余数据的最大&#xff08;最小&#xff09;放到数据 的开头&#xff0c;之后重复即可获得答案。 示例 代码 void SelectSort(OrderList *L) {RecordType t…

tcp/ip协议 error=10022 Winsock.reg Winsock2.reg

tcp/ip协议 error10022 这2个注册表选项千万不能删除&#xff0c;否则上不了网。 按下windows键R键&#xff0c;输入regedit&#xff0c;打开注册表&#xff0c;在文件目录里找到如下两个文件夹&#xff0c;删除这两个文件夹。 路径&#xff1a;HKEY_LOCAL_MACHINE\System\C…

Abaqus飞机起落架扭力臂拓扑优化

Abaqus飞机起落架扭力臂拓扑优化 Abaqus除了可以对结构进行强度分析&#xff0c;同样也自带强大的优化功能&#xff0c;下面通过一个简 单的实例演示在Abaqus中进行拓扑优化&#xff0c;另外&#xff0c;如果需要更加强大的拓扑优化仿真&#xff0c;可以 在TOSCA中进行。 定义接…

基于Qt QChart和QChartView实现正弦、余弦、正切图表

# 源码地址 https://gitcode.com/m0_45463480/QChartView/tree/main# .pro QT += charts​​HEADERS += \ chart.h \ chartview.h​​SOURCES += \ main.cpp \ chart.cpp \ chartview.cpp​​target.path = $$[QT_INSTALL_EXAMPLES]/charts/zoomlinechartINSTAL…

Flutter创建TabBar

使用TabBar和TabBarView来创建一个包含"首页"、"分类"和"我的"的TabBar。每个Tab对应一个Tab控件&#xff0c;TabBarView中的每个页面对应一个Widget。 1.Tab使用自定义图标和颜色 一般UI设计的图会带渐变色之类的&#xff0c;应该保持图片的原…

单相直流电表和单相智能电表有哪些区别?

在众多的智能电表中&#xff0c;单相智能电表已成为家庭用电、工业用电等领域的重要组成部分。与此同时&#xff0c;单相直流电表也因其特性在某些特定场合受到关注。下面就来讲讲两者都有哪些区别&#xff0c;一起来看下吧&#xff01; 一、工作原理及性能差异 1.单相直流电表…

数据标注需要注意的问题

在进行数据标注时&#xff0c;有一些重要的问题需要注意&#xff0c;以确保标注的数据质量和可用性。以下是一些建议和注意事项&#xff1a; 明确定义标签&#xff1a; 确保标签的含义和定义是清晰明确的。标签是对数据的关键描述&#xff0c;因此其含义应该在整个团队中共享和…

并查集带权并查集

定义 : 并查集 : 一种数据结构&#xff0c;用于处理一些不相交集合的合并与查询问题&#xff1b; 例题 : 如 : 有n种元素&#xff0c;分属于不同的n个集合&#xff1b; 有两种操作 : 1.给出两个元素的亲属关系&#xff0c;合并两个集合(x与y是亲戚&#xff0c;亲戚的亲戚…

调研活动怎么做_及时掌握市场趋势

标题&#xff1a;掌握市场趋势&#xff0c;开启调研之旅 一、调研活动的重要性 在当今竞争激烈的市场环境中&#xff0c;了解市场趋势和客户需求至关重要。通过开展有效的调研活动&#xff0c;企业可以获取准确的市场信息和用户反馈&#xff0c;为产品研发、市场营销和战略规…

AKConv:具有任意采样形状和任意数目参数的卷积核

文章目录 摘要1、引言2、相关工作3、方法3.1、定义初始采样位置3.2、可变卷积操作3.3、扩展AKConv3.3、扩展AKConv 4、实验4.1、在COCO2017上的目标检测实验4.2、在VOC 712上的目标检测实验4.3、在VisDrone-DET2021上的目标检测实验4.4、比较实验4.5、探索初始采样形状 5、分析…