Hadoop+Spark大数据技术 实验8 Spark SQL结构化
9.2 创建DataFrame对象的方式
val dfUsers = spark.read.load("/usr/local/spark/examples/src/main/resources/users.parquet")
dfUsers: org.apache.spark.sql.DataFrame = [name: string, favorite_color: string ... 1 more field]
dfUsers.show()
+------+--------------+----------------+ | name|favorite_color|favorite_numbers| +------+--------------+----------------+ |Alyssa| NULL| [3, 9, 15, 20]| | Ben| red| []| +------+--------------+----------------+
9.2.2 json文件创建DataFrame对象
val dfGrade = spark.read.format("json").load("file:/media/sf_download/grade.json")
dfGrade: org.apache.spark.sql.DataFrame = [Class: string, ID: string ... 3 more fields]
dfGrade.show(3)
+-----+---+----+-----+-----+ |Class| ID|Name|Scala|Spark| +-----+---+----+-----+-----+ | 1|106|Ding| 92| 91| | 2|242| Yan| 96| 90| | 1|107|Feng| 84| 91| +-----+---+----+-----+-----+ only showing top 3 rows
9.2.3 RDD创建DataFrame对象
val list = List(
("zhangsan" , "19") , ("B" , "29") , ("C" , "9")
)
val df = sc.parallelize(list).toDF("name","age")
list: List[(String, String)] = List((zhangsan,19), (B,29), (C,9)) df: org.apache.spark.sql.DataFrame = [name: string, age: string]
df.printSchema()
root|-- name: string (nullable = true)|-- age: string (nullable = true)
df.show()
+--------+---+ | name|age| +--------+---+ |zhangsan| 19| | B| 29| | C| 9| +--------+---+
9.2.4 SparkSession创建DataFrame对象
// 1.json创建Datarame对象
val dfGrade = spark.read.format("json").load("file:/media/sf_download/grade.json")
dfGrade.show(3)
+-----+---+----+-----+-----+ |Class| ID|Name|Scala|Spark| +-----+---+----+-----+-----+ | 1|106|Ding| 92| 91| | 2|242| Yan| 96| 90| | 1|107|Feng| 84| 91| +-----+---+----+-----+-----+ only showing top 3 rows
dfGrade: org.apache.spark.sql.DataFrame = [Class: string, ID: string ... 3 more fields]
Selection deleted
// 2.csv创建Datarame对象
val dfGrade2 = spark.read.option("header",true).csv("file:/media/sf_download/grade.json")
dfGrade2: org.apache.spark.sql.DataFrame = [{"ID":"106": string, "Name":"Ding": string ... 3 more fields]
dfGrade2.show(3)
+-----------+-------------+-----------+----------+-----------+
|{"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}|
+-----------+-------------+-----------+----------+-----------+
only showing top 3 rows
Selection deleted
// 3.Parquet创建Datarame对象
val dfGrade3 = spark.read.parquet("file:/usr/local/spark/examples/src/main/resources/users.parquet")
dfGrade3: org.apache.spark.sql.DataFrame = [name: string, favorite_color: string ... 1 more field]
dfGrade3.show(3)
+------+--------------+----------------+ | name|favorite_color|favorite_numbers| +------+--------------+----------------+ |Alyssa| NULL| [3, 9, 15, 20]| | Ben| red| []| +------+--------------+----------------+
9.2.5 Seq创建DataFrame对象
val dfGrade4 = spark.createDataFrame(
Seq(
("A" , 20 ,98),
("B" , 19 ,93),
("C" , 21 ,92),
)
)toDF("Name" , "Age" , "Score")
dfGrade4: org.apache.spark.sql.DataFrame = [Name: string, Age: int ... 1 more field]
dfGrade4.show()
+----+---+-----+ |Name|Age|Score| +----+---+-----+ | A| 20| 98| | B| 19| 93| | C| 21| 92| +----+---+-----+
9.3 DataFrame对象保存为不同格式
9.3.1 write.()保存DataFrame对象
DataFrame.write() 提供了一种方便的方式将 DataFrame 保存为各种格式。以下是几种常见格式的保存方法:
1. 保存为JSON格式
df.write.json("path/to/file.json")
2. 保存为Parquet文件
df.write.parquet("path/to/file.parquet")
3. 保存为CSV文件
df.write.csv("path/to/file.csv")
9.3.2 write.format()保存DataFrame对象
DataFrame.write.format() 提供了一种更灵活的方式来保存 DataFrame,可以通过指定格式名称来选择输出格式。以下是几种常见格式的保存方法:
1. 保存为JSON格式
df.write.format("json").save("path/to/file.json")
2. 保存为Parquet文件
df.write.format("parquet").save("path/to/file.parquet")
3. 保存为CSV文件
df.write.format("csv").save("path/to/file.csv")
9.3.3 先将DataFrame对象转化为RDD再保存文件
虽然可以直接使用 DataFrame 的 write 方法保存文件,但有时需要先将 DataFrame 转换为 RDD 再进行保存。这可能是因为需要对数据进行一些 RDD 特定的操作,或者需要使用 RDD 的保存方法。
rdd = df.rdd.map(lambda row: ",".join(str(x) for x in row))
rdd.saveAsTextFile("path/to/file.txt")
注意:
- 上述代码将 DataFrame 的每一行转换为逗号分隔的字符串,并将结果保存为文本文件。
- 可以根据需要修改代码以使用不同的分隔符或保存为其他格式。
9.4 DataFrame对象常用操作
9.4.1 展示数据
1. show()
// 显示前20行数据
gradedf.show()
// 显示前10行数据
gradedf.show(10)
// 不截断列宽显示数据
gradedf.show(truncate=False)
2. collect()
// 将 DataFrame 转换成 Dataset 或 RDD,返回 Array 对象
gradedf.collect()
3. collectAsList()
// 将 DataFrame 转换成 Dataset 或 RDD,返回 Java List 对象
gradedf.collectAsList()
4. printSchema()
// 打印 DataFrame 的模式(schema)
gradedf.printSchema()
5. count()
// 统计 DataFrame 中的行数
gradedf.count()
6. first()、head()、take()、takeAsList()
// 返回第一行数据
gradedf.first()
// 返回前3行数据
gradedf.head(3)
// 返回前5行数据
gradedf.take(5)
// 返回前5行数据,以 Java List 形式
gradedf.takeAsList(5)
7. distinct()
// 返回 DataFrame 中唯一的行数据
gradedf.distinct.show()
8. dropDuplicates()
// 删除 DataFrame 中重复的行数据
gradedf.dropDuplicates(Seq("Spark")).show()
9.4.2 筛选
1. where()
- 根据条件过滤 DataFrame 中的行数据。
- 示例: gradedf.where("Class = '1' and Spark = '91'").show()
2. filter()
- 与 where() 功能相同,根据条件过滤 DataFrame 中的行数据。
- 示例: gradedf.filter("Class = '1'").show()
3. select()
- 选择 DataFrame 中的指定列。
- 示例: gradedf.select("Name", "Class","Scala").show(3,false)
修改名称:gradedf.select(gradedf("Name").as("name")).show()
4. selectExpr()
- 允许使用 SQL 表达式选择列。
- 示例: gradedf.selectExpr("name", "name as names" ,"upper(Name)","Scala * 10").show(3)
5. col()
- 获取 DataFrame 中指定列的引用。
- 示例: gradedf.col("name")
6. apply()
- 对 DataFrame 中的每一行应用函数。
- 示例: def get_grade_level(grade): return "A" if grade > 90 else "B"
gradedf.select("name", "grade", "grade_level").apply(get_grade_level, "grade_level")
7. drop()
- 从 DataFrame 中删除指定的列。
- 示例: gradedf.drop("grade")
8. limit()
- 限制返回的行数。
- 示例: gradedf.limit(10)
9.4.3 排序
按ID排序
1. orderBy()、sort()
orderBy() 和 sort() 方法都可以用于对 DataFrame 进行排序,它们的功能相同。
// 按id升序排序
gradedf.orderBy("id").show()
gradedf.sort(gradedf("Class").desc,gradedf("Scala").asc).show(3)
// 按id降序排序
gradedf.orderBy(desc("id")).show()
gradedf.sort(desc("id")).show()
2. sortWithinPartitions()
示例:gradedf.sortWithinPartitions("id").show(5)
引申:sortWithinPartitions() 方法用于对 DataFrame 的每个分区内进行排序。
// 首先对 DataFrame 进行重新分区,使其包含两个分区
val partitionedDF = gradedf.repartition(2)
// 对每个分区内的 id 进行升序排序
partitionedDF.sortWithinPartitions("id").show()
需要注意的是,sortWithinPartitions() 方法不会改变 DataFrame 的分区数量,它只是对每个分区内部进行排序。
9.4.4 汇总与聚合
1. groupBy()
groupBy() 方法用于根据指定的列对 DataFrame 进行分组。
(1) 结合 count()
// 统计每个名字的学生人数
gradedf.groupBy("name").count().show()
(2) 结合 max()
// 找出每个课程学生的最高成绩
gradedf.groupBy("Class").max("Scala","Spark").show()
(3) 结合 min()
// 找出每个名字学生的最低成绩
gradedf.groupBy("name").min("grade").show()
(4) 结合 sum()
// 计算每个名字学生的总成绩
gradedf.groupBy("name").sum("grade").show()gradedf.groupBy("Class").sum("Scala","Spark").show()
(5) 结合 mean()
// 计算课程的平均成绩gradedf.groupBy("Class").sum("Scala","Spark").show()
2. agg()
agg() 方法允许对 DataFrame 应用多个聚合函数。
(1) 结合 countDistinct()
// 统计不重复的名字数量
gradedf.agg(countDistinct("name")).show()
(2) 结合 avg()
gradedf.agg(max("Spark"), avg("Scala")).show()
// 计算所有学生的平均成绩
gradedf.agg(avg("grade")).show()
(3) 结合 count()
// 统计学生总数
gradedf.agg(count("*")).show()
(4) 结合 first()
// 获取第一个学生的姓名
gradedf.agg(first("name")).show()
(5) 结合 last()
// 获取最后一个学生的姓名
gradedf.agg(last("name")).show()
(6) 结合 max()、min()
// 获取最高和最低成绩
gradedf.agg(max("grade"), min("grade")).show()
(7) 结合 mean()
// 计算所有学生的平均成绩
gradedf.agg(mean("grade")).show()
(8) 结合 sum()
// 计算所有学生的总成绩
gradedf.agg(sum("grade")).show()
(9) 结合 var_pop()、variance()
// 计算成绩的总体方差
gradedf.agg(var_pop("grade"), variance("grade")).show()
(10) 结合 covar_pop()
// 计算 id 和 grade 之间的总体协方差
gradedf.agg(covar_pop("id", "grade")).show()
(11) 结合 corr()
gradedf.agg(corr("Spark","Scala")).show()
9.4.5 统计

相关文章:
Hadoop+Spark大数据技术 实验8 Spark SQL结构化
9.2 创建DataFrame对象的方式 val dfUsers spark.read.load("/usr/local/spark/examples/src/main/resources/users.parquet") dfUsers: org.apache.spark.sql.DataFrame [name: string, favorite_color: string ... 1 more field] dfUsers.show() -----------…...
认知V2X的技术列一个学习大纲
为了深入学习和理解V2X(Vehicle to Everything)技术,以下是一个学习大纲的概述,结合了参考文章中的相关数字和信息: 一、V2X技术基础 V2X概述 定义:V2X是车用无线通信技术,将车辆与一切事物相连…...
揭秘齿轮加工工艺的选用原则:精准打造高效传动的秘密武器
在机械制造领域,齿轮作为传动系统中的重要组成部分,其加工工艺的选择至关重要。不同的齿轮加工工艺会影响齿轮的精度、耐用性和效率。本文将通过递进式结构,深入探讨齿轮加工工艺的选用原则,带您了解如何精准打造高效传动的秘密武…...
Linux-应用编程学习笔记(二、文件I/O、标准I/O)
一、文件I/O基础 文件 I/O 指的是对文件的输入/输出操作,就是对文件的读写操作。Linux 下一切皆文件。 1.1 文件描述符 在 open函数执行成功的情况下, 会返回一个非负整数, 该返回值就是一个文件描述符(file descriptor&#x…...
AI爆文写作:根据别人的爆款标题,如何通过名词替换改成自己的爆款标题?
在日常刷到爆文的时候,就可以培养自己的网感,为啥这篇文章会爆? 这篇爆文的标题有啥诀窍呢? 比如下面这一篇:《极简生活:变富就是每天循环5个动作》 我们可以发现,每天循环5个动作 这几个词语…...
Mybatis源码剖析---第二讲
Mybatis源码剖析—第二讲 那我们在讲完了mappedstatement这个类,它的一个核心作用之后呢?那下面我有一个问题想问问各位。作为mappedstatement来讲,它封装的是一个select标签或者insert标签。但是呢,我们需要大家注意的是什么&am…...
SpringMvc-restful设计风格
Restful 1、入门1.1 简介1.2 实例 1、入门 1.1 简介 RESTFul是什么 RESTFul是WEB服务接口的一种设计风格。 RESTFul定义了一组约束条件和规范,可以让WEB服务接口更加简洁、易于理解、易于扩展、安全可靠。 1.2 实例 web.xml <?xml version"1.0"…...
在未来你将何去何从?
在数字化的浪潮中,信息技术行业无疑是推动全球经济和社会发展的重要动力。随着科技的不断迭代与进步,云计算、大数据、人工智能(AI)、物联网(IoT)、5G通信和区块链等技术已经深入到我们生活的每一个角落&am…...
Vue.js组件设计模式:构建可复用组件库
在Vue.js中,构建可复用的组件库是提高代码复用性和维护性的关键。下面是一些设计模式,说明如何创建可复用的Vue组件: 1. 单文件组件(Single File Component, SFC) Vue.js组件通常是单文件组件,包含HTML、…...
【C语言】指针运算
前言 前面在“走进指针世界”中我已经讲解过指针相关的很多前置知识,其实还有一个很重要的部分就是指针的运算。这篇博客,就让我们一起了解一下指针的运算吧! 指针作为变量,是可以进行算术运算的,只不过情况会和整型…...
Python学习(3) 函数
定义 定义一个函数的格式: def 函数名(参数):执行代码如果没有参数,则称为无参函数。 定义时小括号中写的是形参(形式参数),调用时写的是实参(实际参数)。 调用 调用格式: def…...
计算机网络安全控制技术
1.防火墙技术 防火墙技术是近年来维护网络安全最重要的手段,但是防火墙不是万能的,需要配合其他安全措施来协同 2.加密技术 目前加密技术主要有两大类:对称加密和非对称加密 3.用户识别技术 核心是识别网络者是否是属于系统的合法用户 …...
WordPress插件Disable WP REST API,可根据是否登录来禁用REST API
前面跟大家分享了代码版禁用WordPress REST API的方法(详见『WordPress4.7以上版本如何禁用JSON REST API?』),不过有些站长不太敢折腾自己的网站代码,那么建议试试这款Disable WP REST API,它可以…...
腾讯云COS上传文件出现的问题
1、没有配置 ObjectMetadata 的文件长度 腾讯云COS上传文件出现数据损坏问题_no content length specified for stream data. strea-CSDN博客 2、 使用 FileInputStream使用完没有及时关闭导致报错 ClientAbortException: java.nio.channels.ClosedChannelException 添加…...
【C++】<知识点> 标准和文件的输入输出
目录 一、输入输出操作 1. 相关的类 2. 标准流对象 3. istream类的成员函数 二、流操纵算子 1. 整数流的基数 2. 浮点数精度的流操纵算子 3. 域宽的流操纵算子 4. 其他的流操纵算子 5. 用户自定义流操纵算子 三、文件读写 1. 文本文件的读写 2. 二进制文件的读写 3. 文件读写…...
在阿里Anolis OS 8.9龙蜥操作系统安装docker
在Anolis OS 8系统安装docker 1.更新系统 sudo dnf update -y2.安装依赖包 sudo dnf install -y yum-utils device-mapper-persistent-data lvm23.添加Docker的官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4.安装…...
短剧APP开发,短剧行业发展下的财富密码
今年以来,短剧市场展现出了繁荣发展的态势,成为了一个风口赛道。 短剧具有不拖沓、时长短、剧情紧凑等优势,顺应了当代人的生活,是当代人的“电子榨菜”。 短剧的快速发展同时也带动了新业态新模式的发展,短剧APP就是…...
简述分代垃圾回收器是怎么工作的?
分代垃圾回收器是一种用于管理和回收内存中垃圾对象的技术。它根据对象的存活时间将内存分为不同的代,并针对每个代应用不同的垃圾回收策略。 分代垃圾回收器的工作过程如下: 内存分代:首先,将内存分为不同的代,通常是…...
Qt 自定义代理类
一.使用步骤 继承QStyledItemDelegate类:首先创建一个新的类并继承自QStyledItemDelegate类,作为您的自定义代理类。 实现代理类的构造函数:在代理类中实现构造函数,并在构造函数中调用基类的构造函数,可以选择传入一…...
android GridLayout 布局详解,并举例
GridLayout 是 Android 中的一个布局容器,它允许你在一个二维网格中排列子视图。你可以指定网格的行数和列数,或者让 GridLayout 自动计算它们。每个子视图都可以占据一个或多个网格单元格。GridLayout 非常适合在需要创建规则网格的应用中使用ÿ…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
