Hadoop+Spark大数据技术 第七次作业

  • 第七次作业

    • 1. 简述Spark SQL使用的数据抽象DataFrame与Dataset的区别。

      • DataFrame: 基于 Row 对象的二维表格结构,类似于关系型数据库中的表。 行和列都有明确的 Schema(模式),可以进行类型推断。 提供了丰富的操作接口,如 select、filter、group by、agg 等。 缺点: 需要在操作时进行类型转换,例如使用 col("age").cast("int") 将类型转换为 Int。

      • Dataset: 基于特定类型的数据结构,例如 Dataset[Student],其中 Student 是一个 case class。 相比 DataFrame,Dataset 能更方便地进行类型推断,无需显式转换。 优点: 代码更简洁,类型安全,编译器可以进行类型检查。 总结: 当需要进行类型安全的操作时,Dataset 是更好的选择。当数据结构复杂,需要进行类型转换时,DataFrame 更灵活。

    • 2. 简述创建DataFrame对象的常用方法

      • 1. Parquet文件创建:使用`SparkSession`的`read.parquet()`方法从Parquet文件中创建DataFrame。

      • 2. json文件创建DataFrame对象:通过`SparkSession`的`read.json()`方法,可以从JSON文件中读取数据并创建DataFrame。

      • 3. RDD创建DataFrame对象:如果有一个RDD,使用`SparkSession`的`createDataFrame()`方法将其转换为DataFrame。

      • 4. SparkSession创建:`SparkSession`是Spark 2.0引入的入口点,可以直接用来创建DataFrame。如

      • 5. Seq创建DataFrame对象: `SparkSession`的`createDataFrame()`方法也可以接受一个包含元组的Scala `Seq`。

    • 3. 简述DataFrame对象的常用操作

      • 见实验8

    • 4. 阅读、分析下列各程序段中各语句的功能,并给出运行结果。

(1) 设grade.json文件的内容如下,给出分析
{"ID":"106","Name":"Ding","Class":"1","Scala":92,"Spark":91}
{"ID":"242","Name":"Yan","Class":"2","Scala":96,"Spark":90}
{"ID":"107","Name":"Feng","Class":"1","Scala":84,"Spark":91}
{"ID":"230","Name":"Wang","Class":"2","Scala":87,"Spark":91}
{"ID":"153","Name":"Zhang","Class":"1","Scala":62,"Spark":71}
{"ID":"242","Name":"Xu","Class":"2","Scala":88,"Spark":90}
{"ID":"235","Name":"Wu","Class":"1","Scala":83,"Spark":91}
{"ID":"224","Name":"Xia","Class":"2","Scala":89,"Spark":91}

val gradeDF=spark.read.json("grade.json")
gradeDF.count()
gradeDF.groupBy("Class").count().show()

(2) 设grade.txt文件的内容如下,给出分析
106,Ding,92,95,91
242,Yan,96,93,90
107,Feng,84,92,91
230,Wang,87,86,91
153,Zhang,85,90,92
224,Men,83,86,90
236,Wang1,87,85,89
210,Han,73,93,88
101,An,84,93,88
127,Pen,81,93,91
237,Du,83,81,85

    val lineRDD = sc.textFile("grade.txt").map{line => line.split(",")}
    val studentRDD = lineRDD.map(x => (x(0).toInt,x(1).toString,x(2).toInt,x(3).toInt,x(4).toInt))
    val studentDF = studentRDD.toDF("ID","Name","Scala","Spark","Python")
    studentDF.show()

(3) 设grade.txt文件的内容与(2)相同,给出分析
case class Student(ID:Int,Name:String,Scala:Int,Spark:Int,Python:Int)
val stuDS = spark.read.textFile("grade.txt")
val studentDataset = stuDS.map(line => {val x = line.split(",");
val ID = x(0).toInt;
val Name = x(1);
val Java = x(2).toInt;
val Scala = x(3).toInt;
val Python = x(4).toInt;
Student(ID,Name,Java,Scala,Python)})
studentDataset.sort(studentDataset("ID").desc).show()

(1)这段代码分析及运行结果:
   - `spark.read.json("grade.json")`:从给定的grade.json文件中读取数据,创建一个DataFrame `gradeDF`。
   - `gradeDF.count()`:返回DataFrame的行数,这里有8行数据。
   - `gradeDF.groupBy("Class").count().show()`:按照"Class"字段对数据进行分组,并计算每组的行数,然后显示结果。
     ```
     +-----+-----+
     |Class|count|
     +-----+-----+
     |   1 |   4 |
     |   2 |   4 |
     +-----+-----+
     ```
   - 输出显示有两个班级,每个班级各有4个学生。

(2)这段代码分析及运行结果:
   - `sc.textFile("grade.txt").map{line => line.split(",")}`:读取grade.txt文件,将每一行分割成数组,并创建一个新的RDD `lineRDD`。
   - `lineRDD.map(x => (x(0).toInt,x(1).toString,x(2).toInt,x(3).toInt,x(4).toInt))`:将RDD `lineRDD`中的每个元素(数组)转换为元组,然后创建一个新的RDD `studentRDD`。
   - `studentRDD.toDF("ID","Name","Scala","Spark","Python")`:将`studentRDD`转换为DataFrame `studentDF`,并指定列名。
   - `studentDF.show()`:显示DataFrame `studentDF`的内容。
     ```
     +---+----+-----+-----+-----+
     | ID|Name|Scala|Spark|Python|
     +---+----+-----+-----+-----+
     |106| Ding|   92|   95|   91|
     |242| Yan |   96|   93|   90|
     |107| Feng|   84|   92|   91|
     |230| Wang|   87|   86|   91|
     |153|Zhang|   85|   90|   92|
     |224| Men |   83|   86|   90|
     |236|Wang1|   87|   85|   89|
     |210| Han |   73|   93|   88|
     |101|  An |   84|   93|   88|
     |127| Pen |   81|   93|   91|
     |237|  Du |   83|   81|   85|
     +---+----+-----+-----+-----+
     ```
   - 输出展示了10个学生的信息,包括ID、Name、Scala、Spark和Python的分数。

(3)这段代码分析及运行结果:
   - `case class Student(ID:Int,Name:String,Scala:Int,Spark:Int,Python:Int)`:定义了一个名为`Student`的case class,包含5个字段。
   - `spark.read.textFile("grade.txt")`:读取grade.txt文件,创建RDD `stuDS`。
   - `stuDS.map...`:将RDD `stuDS`中的每一行数据转换为`Student`对象,然后创建一个新的Dataset `studentDataset`。
   - `studentDataset.sort(studentDataset("ID").desc).show()`:按ID字段降序排序`studentDataset`,然后显示结果。
     ```
     +---+----+-----+-----+-----+
     | ID|Name|Java |Scala|Python|
     +---+----+-----+-----+-----+
     |237|  Du|   83|   81|   85|
     |236|Wang1|   87|   85|   89|
     |230| Wang|   87|   86|   91|
     |224| Men |   83|   86|   90|
     |210| Han |   73|   93|   88|
     |127| Pen |   81|   93|   91|
     |107| Feng|   84|   92|   91|
     |106| Ding|   92|   95|   91

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

打开C语言常用的内存函数大门(三) —— memset()函数(内含讲解用法和模拟实现)

文章目录 1. 前言2. memset函数2.1 memset函数原型2.2 memset函数参数的介绍2.3 memset函数的使用演示 3. memset函数的模拟实现4. 总结 1. 前言 哈喽,我们又见面了。通过前面两个内存函数(memcpy、memmove函数)讲解的锤炼后,对如何解析一个自己从来没有…

9. C++通过epoll+fork的方式实现高性能网络服务器

epollfork 实现高性能网络服务器 一般在服务器上,CPU是多核的,上述epoll实现方式只使用了其中的一个核,造成了资源的大量浪费。因此我们可以将epoll和fork结合来实现更高性能的网络服务器。 创建子进程函数–fork( ) 要了解线程我们先来了解…

Linux input输入子系统

Linux input 更多内容可以查看我的github Linux输入子系统框架 Linux输入子系统由驱动层、核心层、事件处理层三部分组成。 驱动层:输入设备的具体驱动程序,负责与具体的硬件设备进行交互,并将底层的硬件输入转化为统一的事件形式&#xff…

自然语言处理(NLP)—— 信息提取与文档分类

1. 初识信息提取 1.1 信息提取的基本知识 1.1.1 信息提取的概念 信息提取(IE, Information Extraction)是自然语言处理(NLP)领域的一个重要分支,它专注于从文档或语料库中提取结构化信息。这与信息检索(I…

江协科技STM32学习-1 购买24Mhz采样逻辑分析仪

前言: 本文是根据哔哩哔哩网站上“江协科技STM32”视频的学习笔记,在这里会记录下江协科技STM32开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技STM32教学视频和链接中的内容。 引用: STM32入门教程-2023版 细致讲…

windows11家庭版、专业版、工作站版区别

windows11家庭版、专业版、工作站版区别 1、windows11家庭版和专业版的区别2、windows11家庭版和工作站版的区别 1、windows11家庭版和专业版的区别 windows11专业版需要$808 windows11专业版和家庭版功能对比 2、windows11家庭版和工作站版的区别 windows11工作站版需要$168…

Python基础教程——数据类型和变量

数据类型和变量 Python使用缩进来组织代码块,一般使用4个空格的缩进.使用#来注释一行,其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块.Python对大小写敏感. 1.1 整数 Python可以处理任意大小的整数,包括负整数,写法与数学上写法一致,例如:-10…

揭秘小程序商城的团购奇迹:独特模式引领盈利新纪元

在数字经济的新纪元里,你是否对那些不张扬却充满潜力的商业模式心生好奇?今天,我要为你揭示一种别出心裁的商业模式,它以其独特的魅力,不仅迅速吸引了大量用户的目光,更在短短一个月内创造了超过600万的惊人…

javascript DOM 设置样式

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、直接…

EXSI虚拟机新增磁盘并将空间扩充到已有分区

这里写自定义目录标题 1、在EXSI虚拟机中新增一块磁盘配置大小2、确认新磁盘3、格式化新分区4、添加新分区到LVM5、将新增分区添加到已有分区里 1、在EXSI虚拟机中新增一块磁盘配置大小 注意事项: (1)需确保虚拟机已关闭活处于维护模式,避免数据丢失 (2…

【通信专题】I2C上拉电阻计算方法

I2C 通信总线是电子设计中常见的总线之一,由于 I2C 的硬件芯片内部为开漏输出,所以要求在外部增加一个上拉电阻,总线上拉电阻的选取受多个因素的影响,因此如何计算 I2C 总线的上拉电阻阻值成为硬件工程师在使用 I2C总统时需要关注的话题。 从本质上讲: I2C 总线电容和上升…

善听提醒遵循易经原则。世界大同只此一路。

如果说前路是一个大深坑,那必然是你之前做的事情做的不太好,当坏的时候,坏的结果来的时候,是因为你之前的行为,你也就不会再纠结了,会如何走出这个困境,是好的来了,不骄不躁&#xf…

阿里云 通过EIP实现VPC下的SNAT以及DNAT

192.168.0.85 有公网地址192.1680.95无公网地址 在192.168.0.85(有公网地址服务器上操作) #开启端口转发 echo "net.ipv4.ip_forward 1" >> /etc/sysctl.conf sysctl -p#仅允许192.168.0.95 iptables -t nat -I POSTROUTING -s 192.16…

中医的悠久历史文化

中医,作为中华民族的传统医学,拥有着悠久的历史和深厚的文化底蕴。自古以来,中医便以其独特的理论体系和治疗方法,为中华民族的繁衍昌盛做出了巨大贡献。如今,随着现代医学的不断发展,中医依然以其独特的魅…

使用onnxruntime加载YOLOv8生成的onnx文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集,使用 LabelMe 工具进行标注,然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件,并自动生成YOLOv8支持的目录结构,包括melon.yaml文件,其内容…

Unity实现简单的持久化存储

在Unity中,运行过程中的内容是不会保存的,但是如果我们有些游戏数据需要持久化存储,应该怎么办呢,所以Unity为我们提供了一个简单的数据存储的API。 附上代码片段 //写入数据PlayerPrefs.SetInt("IntType", 1);PlayerPr…

CMake的作用域:public/private/interface

在 CMake 中,public、private和 interface是用来指定目标属性的作用域的关键字,这三个有什么区别呢?这些关键字用于控制属性的可见性和传递性,影响了目标之间的依赖关系和属性传递。 public 如果在一个目标上使用 public关键字时…

子集树与排列树的构造

排列树的构造: 无重复画法:一条线前面出现的不再出现。 有重复画法:一条线前面出现的不再出现,如果仅仅只是相似可以出现;兄弟不能相似。 目标函数是:cnt 总元素个数分支策略是全遍历,不过存…

AI播客下载:a16z (主题为AI、web3、生物技术等风险投资)

a16z播客是一个综合性的科技和创新领域的媒体平台,通过多种节目形式和丰富的内容,为广大听众提供了一个了解最新科技趋势和创新思维的窗口。a16z播客是由安德里森霍罗威茨(Andreessen Horowitz,简称a16z)推出的一个科技…

Resilience4j结合微服务出现的异常

Resilience4j结合微服务出现的异常 1、retry未生效 由于支持aop&#xff0c;所以要引入aop的依赖。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>2、circ…