【Spark编程基础】实验一Spark编程初级实践(附源代码)

news2024/11/17 9:57:08

文章目录

  • 一、实验目的
  • 二、实验平台
  • 三、实验内容和要求
    • 1. 计算级数
    • 2. 模拟图形绘制
    • 3.统计学生成绩

一、实验目的

1.掌握 Scala 语言的基本语法、数据结构和控制结构;
2.掌握面向对象编程的基础知识,能够编写自定义类和特质;
3.掌握函数式编程的基础知识,能够熟练定义匿名函数。熟悉 Scala 的容器类库的基本
层次结构,熟练使用常用的容器类进行数据;
4.熟练掌握 Scala 的 REPL 运行模式和编译运行方法。

二、实验平台

操作系统:Ubuntu16.04;
Spark 版本:2.1.0;
Hadoop 版本:2.7.1。

三、实验内容和要求

1. 计算级数

请用脚本的方式编程计算并输出下列级数的前 n 项之和 Sn,直到 Sn 刚好大于或等于 q
为止,其中 q 为大于 0 的整数,其值通过键盘输入。
在这里插入图片描述
例 如 ,若 q 的 值 为 50.0 , 则输出应为:Sn=50.416695请将源文 件保存为 exercise2-1.scala,在REPL模式下测试运行,测试样例:q=1时,Sn=2;q=30时,Sn=30.891459;
q=50 时,Sn=50.416695。

scala> import io.StdIn._
import io.StdIn._
scala> var Sn:Float = 0 
Sn: Float = 0.0
scala> var n:Float=1 
n: Float = 1.0
scala> println("please input q:") 
please input q:
scala> val q = readInt()
q: Int = 50

scala> while(Sn<q){ 
     | Sn+=(n+1)/n 
     | n+=1
     | }

scala> println(s"Sn=$Sn")
Sn=50.416695

2. 模拟图形绘制

对于一个图形绘制程序,用下面的层次对各种实体进行抽象。定义一个 Drawable 的特 质,其包括一个 draw 方法,默认实现为输出对象的字符串表示。定义一个 Point 类表示点 其混入了 Drawable 特质,并包含一个 shift 方法,用于移动点。所有图形实体的抽象类为 Shape,其构造函数包括一个 Point 类型,表示图形的具体位置(具体意义对不同的具体图形不一样)。Shape 类有一个具体方法 moveTo 和一个抽象方法 zoom,其中 moveTo 将图形从当前位置移动到新的位置, 各种具体图形的 moveTo 可能会有不一样的地方。zoom 方法实现对图形的放缩,接受一个浮点型的放缩倍数参数,不同具体图形放缩实现不一样。继承Shape 类的具体图形类型包括直线类 Line 和圆类 Circle。Line 类的第一个参数表示其位置,第二个参数表示另一个端点,Line 放缩的时候,其中点位置不变,长度按倍数放缩(注意,缩放时,其两个端点信息也改变了),另外,Line 的 move 行为影响了另一个端点,需要对move 方法进行重载。Circle 类第一个参数表示其圆心,也是其位置,另一个参数表示其半径,Circle 缩放的时候,位置参数不变,半径按倍数缩放。另外直线类 Line 和圆类 Circle都混入了 Drawable 特质,要求对 draw 进行重载实现,其中类 Line 的 draw 输出的信息样式为“Line:第一个端点的坐标–第二个端点的坐标)”,类 Circle 的 draw 输出的信息样式为“Circle center:圆心坐标,R=半径”。如下的代码已经给出了 Drawable 和 Point 的定义,同时也给出了程序入口 main 函数的实现,请完成 Shape 类、Line 类和 Circle 类的定义。

case class Point(var x:Double,var y:Double) extends Drawable{
  def shift(deltaX:Double,deltaY:Double){x+=deltaX;y+=deltaY}
}
//特征
trait Drawable{
  def draw(){println(this.toString)}
}

//图形抽象类
abstract class Shape(var point: Point){
  var r=4.0
  def moveTo(point2: Point): Unit ={
    point=point2
  }
  // 抽象方法没有方法体
  def zoom(b:Double): Unit
  //圆形构造函数
  def this(cpoint: Point, cr:Double){
    //第一行必须要先调用默认的构造函数
    this(cpoint: Point)
    this.r=cr
  }
  //直线构造函数
  def this(lpoint:Point,lpoint2:Point){
    this(lpoint: Point)

  }
}
//圆形
class Circle(point: Point,R:Double) extends Shape(point: Point) with Drawable{
  r=R
  //重写,对图形放大,半径放大
  override def zoom(b:Double): Unit = {
    r = r * b
  }
  //重写,打印
  override def draw(): Unit ={
    var toString="Circle center:("+point.x+","+point.y+")\t"+"R="+r
    println(toString)
  }
  //重写,移动
  override def moveTo(point2: Point): Unit ={
    point.x=point2.x
    point.y=point2.y
  }
}
//直线
class Line(point: Point, point1: Point)extends Shape(point: Point) with Drawable{
  //重写,对图形放大
  override def zoom(b:Double): Unit = {
    var xmid=(point1.x+point.x)/2   //寻找中点坐标
    var ymid=(point1.y+point.y)/2
    point.x=xmid-(xmid-point.x)*b
    point.y=ymid-(ymid-point.y)*b
    point1.x=xmid+(point1.x-xmid)*b
    point1.y=ymid+(point1.y-ymid)*b
  }
  //重写,打印
  override def draw(): Unit ={
    var toString="Line:("+point.x+","+point.y+")--"+"("+point1.x+","+point1.y+")"
    println(toString)
  }
  //重写,移动
  override def moveTo(point2: Point): Unit ={
    point1.x=point1.x+point2.x-point.x
    point1.y=point1.y+point2.y-point.y
    point.x=point2.x
    point.y=point2.y
  }
}

object  MyDraw {
  def main(args: Array[String]) {
    val p=new Point(10,30)
    p.draw;

    val line1 = new Line(Point(0,0),Point(20,20))
    line1.draw
    line1.moveTo(Point(5,5)) //移动到一个新的点
    line1.draw
    line1.zoom(2) //放大两倍
    line1.draw
    
    val cir= new Circle(Point(10,10),5)
    cir.draw
    cir.moveTo(Point(30,20))
    cir.draw
    cir.zoom(0.5)
    cir.draw

  }
}

3.统计学生成绩

学生的成绩清单格式如下所示,第一行为表头,各字段意思分别为学号、性别、课程名 1、课程名 2 等,后面每一行代表一个学生的信息,各字段之间用空白符隔开
Id gender Math English Physics
301610 male 80 64 78
301611 famale 65 87 58
给定任何一个如上格式的清单(不同清单里课程数量可能不一样),要求尽可能采用函 数式编程,统计出各门课程的平均成绩,最低成绩,和最高成绩;另外还需按男女同学分开,分别统计各门课程的平均成绩,最低成绩,和最高成绩。

object scoreReport{ 
def main(args: Array[String]) { 
val inputFile = scala.io.Source.fromFile("test.txt") 
val originalData = 
inputFile.getLines.map{_.split("\\s+")} .toList 
val courseNames = originalData.head.drop(2) //获取第一行中的课程名 
val allStudents = originalData.tail // 去除第一行剩下的数据 
val courseNum = courseNames.length 

def statistc(lines:List[Array[String]])= { 

(for(i<- 2 to courseNum+1) yield { 
val temp = lines map {elem=>elem(i).toDouble} 
(temp.sum,temp.min,temp.max) 
}) map {case (total,min,max) => (total/lines.length,min,max) 
} // 最后一个 map 对 for 的结果进行修改,将总分转为平均分 
} 
// 输出结果函数 
def printResult(theresult:Seq[(Double,Double,Double)]){ 
// 遍历前调用 zip 方法将课程名容器和结果容器合并,合并结果为二元组容器 
(courseNames zip theresult) foreach { 
case (course,result)=> 
println(f"${course+":"}%-10s${result._1}%5.2f${result._2}%8.2f${result._3}%8.2f") 
} 
} 
// 分别调用两个函数统计全体学生并输出结果 
val allResult = statistc(allStudents) 
println("course average min max") 
printResult(allResult) 
//按性别划分为两个容器 
val (maleLines,femaleLines) = allStudents partition 
{_(1)=="male"} 
// 分别调用两个函数统计男学生并输出结果 
val maleResult = statistc(maleLines) 
println("course average min max") 
printResult(maleResult) 
// 分别调用两个函数统计男学生并输出结果 
val femaleResult = statistc(femaleLines) 
println("course average min max") 
printResult(femaleResult) 
} 
}

注意:这里应提前创建一个test.txt文件(默认在当前目录下创建)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3速查笔记

文章目录 一、创建Vue3.0工程1.使用 vue-cli 创建2.使用 vite 创建 二、常用 Composition API1.拉开序幕的setup2.ref函数3.reactive函数4.Vue3.0中的响应式原理vue2.x的响应式Vue3.0的响应式 5.reactive对比ref6.setup的两个注意点7.计算属性与监视1.computed函数2.watch函数3…

Windows电脑安装Linux(Ubuntu 22.04)系统(图文并茂)

Windows电脑安装Ubuntu 22.04系统&#xff0c;其它版本的Ubuntu安装方法相同 Ubuntu 16.04、Ubuntu 18.04安装方法相同&#xff0c;制作U盘启动项的镜像文件下载你需要的版本即可&#xff01; Ubuntu的中文官网网址&#xff1a;https://cn.ubuntu.com/&#xff0c;聪明的你一定…

【线程】封装 | 安全 | 互斥

线程封装&#xff08;面向对象&#xff09; 1.组件式的封装出一个线程类&#xff08;像C11线程库那样去管理线程&#xff09; 我们并不想暴露出线程创建&#xff0c;终止&#xff0c;等待&#xff0c;分离&#xff0c;获取线程id等POSIX线程库的接口&#xff0c;我们也想像C1…

IDEA管理Git + Gitee 常用操作

文章目录 IDEA管理Git Gitee 常用操作1.Gitee创建代码仓库1.创建仓库1.点击新建仓库2.完成仓库信息填写3.创建成功4.管理菜单可以修改这个项目的设置 2.设置SSH公钥免密登录基本介绍1.找到.ssh目录2.执行指令 ssh-keygen3.将公钥信息添加到码云账户1.点击设置2.ssh公钥3.复制.…

React-配置别名@

1.概念 说明&#xff1a;路径解析配置(webpack),把/解析为src/&#xff1b;路径联想配置(VsCode),VsCode在输入/时&#xff0c;自动联想出来对应的src/下的子级目录。CRA本身把webpacki配置包装到了黑盒里无法直接修改&#xff0c;需要借助一个插件-craco。 2.实现步骤 2.1安…

docker常用操作-docker私有仓库的搭建(Harbor),并将本地镜像推送至远程仓库中。

1、docker-compose安装&#xff0c;下载docker-compose的最新版本 第一步&#xff1a;创建docker-compose空白存放文件vi /usr/local/bin/docker-compose 第二步&#xff1a;使用curl命令在线下载&#xff0c;并制定写入路径 curl -L "https://github.com/docker/compos…

npm市场发布包步骤

1.打开npm官网npm官网 2.创建自己的账号 3.查看当前npm的镜像源&#xff0c; 如果出现淘宝的镜像源则需要切换成官方的镜像源 npm config get registry //查看镜像源 https://registry.npm.taobao.org/ //淘宝的镜像源 https://registry.npmjs.org/ //官方的镜像源 …

IPO[困难]

优质博文IT-BLOG-CN 一、题目 假设你的公司即将开始IPO。为了以更高的价格将股票卖给风险投资公司&#xff0c;你的公司希望在IPO之前开展一些项目以增加其资本。 由于资源有限&#xff0c;它只能在IPO之前完成最多k个不同的项目。帮助你的公司设计完成最多k个不同项目后得到最…

基于遗传算法GA的机器人栅格地图最短路径规划,可以自定义地图及起始点(提供MATLAB代码)

一、原理介绍 遗传算法是一种基于生物进化原理的优化算法&#xff0c;常用于求解复杂问题。在机器人栅格地图最短路径规划中&#xff0c;遗传算法可以用来寻找最优路径。 遗传算法的求解过程包括以下几个步骤&#xff1a; 1. 初始化种群&#xff1a;随机生成一组初始解&…

LC3014 输入单词需要的最少按键次数Ⅰ与方法内容的易读性

题目 刷题做到力扣 3014&#xff0c;题目要求设计电话键盘上的按键映射&#xff0c;返回按出 word 单词的最小按键次数&#xff0c;1 ≤ word.length ≤ 26&#xff0c;且仅由小写英文字母组成&#xff0c;所有字母互不相同 我的题解 简单题&#xff0c;略加思索拿下&#x…

给定l,r(1e18),定义f(x):x中最大的数位减去最小数位。对于l<=x<=r, 求f(x)最小值

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5, base 397; const i…

【JAVA】CSS3伸缩盒案例、响应式布局、BFC

1.CSS3伸缩盒案例 效果&#xff1a;用伸缩盒模型 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>&…

Day33:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制

目录 JavaEE-预编译-SQL JavaEE-过滤器-Filter JavaEE-监听器-Listen 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架库&#xff1a;MyBatis&#…

复合查询【MySQL】

文章目录 复合查询测试表 单表查询多表查询子查询单行子查询多行子查询IN 关键字ALL 关键字ANY 关键字 多列子查询 合并查询 复合查询 测试表 雇员信息表中包含三张表&#xff0c;分别是员工表&#xff08;emp&#xff09;、部门表&#xff08;dept&#xff09;和工资等级表&…

Python刘诗诗

写在前面 刘诗诗在电视剧《一念关山》中饰演了女主角任如意&#xff0c;这是一个极具魅力的女性角色&#xff0c;她既是一位有着高超武艺和智慧的女侠士&#xff0c;也曾经是安国朱衣卫前左使&#xff0c;身怀绝技且性格坚韧不屈。剧中&#xff0c;任如意因不满于朱衣卫的暴行…

Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 前言 1 基础知识回顾 1.1 线程的创建和启动 1.2 线程池的使用 2.运行环境说…

JVM学习之常见知识点汇总、2024详细版面试问题汇总;JVM组成、类加载器、GC垃圾回收、堆、栈、方法区

目录 JVM组成 什么是程序计数器 详细的介绍一下Java的堆 什么是虚拟机栈 堆和栈的区别 堆空间的分配策略 对于方法区的解释 IO和NIO拷贝数据的对比 JVM内存结构 JVM去除永久代改用元空间替代的原因 类加载器 什么是类加载器&#xff0c;类加载器有哪些 什么是双亲…

吴恩达机器学习-可选实验室:可选实验:使用逻辑回归进行分类(Classification using Logistic Regression)

在本实验中&#xff0c;您将对比回归和分类。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_common import dlc, plot_data from plt_one_addpt_onclick import plt_one_addpt_onclick plt.style.use(./deeplearning.mplstyle)jupy…

计算机组成原理实验报告1 | 实验1.1 运算器实验(键盘方式)

本文整理自博主大学本科《计算机组成原理》课程自己完成的实验报告。 —— *实验环境为学校机房实验箱。 目录 一、实验目的 二、实验内容 三、实验步骤及实验结果 Ⅰ、单片机键盘操作方式实验 1、实验连线&#xff08;键盘实验&#xff09; 2、实验过程 四、实验结果的…

C语言:深入补码计算原理

C语言&#xff1a;深入补码计算原理 有符号整数存储原码、反码、补码转换规则数据与内存的关系 补码原理 有符号整数存储 原码、反码、补码 有符号整数的2进制表示方法有三种&#xff0c;即原码、反码和补码 三种表示方法均有符号位和数值位两部分&#xff0c;符号位用0表示“…