Spark-SQL核心编程
简介
Hadoop与Spark-SQL的对比
Hadoop在处理结构化数据方面存在局限性,无法有效处理某些类型的数据。
Spark应运而生,特别设计了处理结构化数据的模块,称为Spark SQL(原称Shark)。
SparkSQL的发展历程:
SparkSQL的前身Shark,它是伯克利实验室Spark生态组件之一,基于Hive 所开发的工具。Shark 的出现,使得 SQL-on-Hadoop 的性能比 Hive 有了 10-100 倍的提高。
随着Spark的发展,Shark逐渐被Spark SQL取代,Spark SQL不再依赖Hive,兼容性更强。
Spark SQL与Hadoop的关系
SparkSQL作为Spark生态的一员继续发展,不再受限于 Hive,只是兼容 Hive。 Spark 作为 Hive 的底层引擎之一,也就是说,Hive 将不再受限于一个引擎,可以采用 Map-Reduce、Tez、Spark 等引擎。
Spark-SQL的特点
整合性:无缝整合Spark查询和编程。

统一数据访问:使用相同方式连接不同数据源。

兼容性:兼容Hive,可在已有仓库上直接运行SQL和HQL。

标准数据连接:支持JDBC和ODBC连接。

DataFrame与DataSet
DataFrame:类似于表格,包含列名和行索引,适合结构化数据。
DataSet:强类型集合,必须指定数据类型。
将 DataFrame 转换为 DataSet。Row 是一个类型,跟 Car、Person 这些的类型一样,所有的表结构信息都用 Row 来表示。获取数据时需要指定顺序
核心编程
解决类加载报错问题:
遇到类加载报错的解决方法:
检查对象名和类名是否一致
确认代码编辑器没有卡顿,并且新建类时选择正确
设置代码为根目录
DataFrame
Spark SQL 的 DataFrame API 允许我们使用 DataFrame 而不用必须去注册临时表或者生成 SQL 表达式。DataFrame API 既有 transformation 操作也有 action 操作。
创建 DataFrame
在 Spark SQL 中 SparkSession 是创建 DataFrame 和执行 SQL 的入口,创建 DataFrame
有三种方式:通过 Spark 的数据源进行创建;
从一个存在的 RDD 进行转换;还可以从 Hive
Table 进行查询返回。
从 Spark 数据源进行创建
Spark-SQL支持的数据类型:
![]()
在 spark 的 bin/data 目录中创建 user.json 文件
{"username":"zhangsan","age":20}
{"username":"lisi","age":17}
读取 json 文件创建 DataFrame
val df = spark.read.json("data/user.json")(进入的是自己放入的目录)
需要先进入这个里面:


注意:如果从内存中获取数据,spark 可以知道数据类型具体是什么。如果是数字,默认作为 Int 处理;但是从文件中读取的数字,不能确定是什么类型,所以用 bigint 接收,可以和 Long 类型转换,但是和 Int 不能进行转换。
SQL 语法
SQL 语法风格是指我们查询数据的时候使用 SQL 语句来查询,这种风格的查询必须要
有临时视图或者全局视图来辅助
读取 JSON 文件创建 DataFrame
val df1 = spark.read.json("data/user.json")
对 DataFrame 创建一个临时表
df1.createOrReplaceTempView("people")
通过 SQL 语句实现查询全表
val sqlDF = spark.sql("select * from people")
结果展示
sqlDF.show

对于 DataFrame 创建一个全局表
df1.createGlobalTempView("people1")
(全局不要随便弄,怕跟自己之前弄过的名称重了,到时会报错)
第一次运行全局表会出现这个错误,需要将虚拟中的hive-site.xml文件复制到spark的conf路径下(最好能将整个hive目录放在本地文件系统中)
配置完成之后再执行语句:
df1.createGlobalTempView("people1")
通过 SQL 语句实现查询全表
spark.sql("SELECT * FROM global_temp.people1").show()
spark.newSession().sql("SELECT * FROM global_temp.people1").show()
DSL 语法
DataFrame 提供一个特定领域语言(domain-specific language, DSL)去管理结构化的数据。 可以在 Scala, Java, Python 和 R 中使用 DSL,使用 DSL 语法风格不必去创建临时视图了
创建一个 DataFrame
val df = spark.read.json("data/user.json")
查看 DataFrame 的 Schema 信息
df.printSchema
只查看"username"列数据
df.select("username").show()

查看"username"列数据以及"age+1"数据
注意:涉及到运算的时候, 每列都必须使用$, 或者采用引号表达式:单引号+字段名
df.select($"username",$"age" + 1).show
df.select('username, 'age + 1).show()

查看"age"大于"18"的数据
df.filter($"age">18).show
按照"age"分组,查看数据条数
df.groupBy("age").count.show

RDD 转换为 DataFrame
val idRDD = sc.textFile("data/id.txt")

idRDD.toDF("id").show

DataSet
创建 DataSet
使用样例类序列创建 DataSet
case class Person(name: String, age: Long)
val caseClassDS = Seq(Person("zhangsan",2)).toDS()
caseClassDS.show

使用基本类型的序列创建 DataSet
val ds = Seq(1,2,3,4,5).toDS
ds.show

注意:在实际使用的时候,很少用到把序列转换成DataSet,更多的是通过RDD来得到DataSet
RDD 转换为 DataSet
SparkSQL 能够自动将包含有 case 类的 RDD 转换成 DataSet,case 类定义了 table 的结 构,case 类属性通过反射变成了表的列名。Case 类可以包含诸如 Seq 或者 Array 等复杂的结构。
case class User(name:String, age:Int)
sc.makeRDD(List(("zhangsan",30), ("lisi",49))).map(t=>User(t._1, t._2)).toDS

DataSet 转换为 RDD
DataSet 其实也是对 RDD 的封装,所以可以直接获取内部的 RDD
case class User(name:String, age:Int)
sc.makeRDD(List(("zhangsan",30), ("lisi",49))).map(t=>User(t._1, t._2)).toDS
val rdd = res3.rdd(这个res后面跟的数是根据上一个代码出来的结果里的)
rdd.collect

DataFrame 转换为 DataSet
case class User(name:String, age:Int)

val df = sc.makeRDD(List(("zhangsan",30), ("lisi",49))).toDF("name","age")

val ds = df.as[User]

创建和转换数据集
使用样例类创建数据集:通过 case class 定义类和字段类型。
添加数据后,默认是 RDD,需转换为数据集。
使用基本类型创建数据集:直接使用 DataSet 创建数据集。
RDD 和数据集的转换:RDD 转数据集:使用 toDS() 方法。
数据集转 RDD:使用 rdd 属性。
RDD、DataFrame 和 DataSet 的关系
共性:
都是 Spark 平台下的分布式弹性数据集。
都有惰性机制,只有在行动算子触发时才执行。
都支持自动缓存和分区概念。
都可以使用模式匹配获取字段值和类型。
区别:
RDD 支持 MLLIB,常用于机器学习。
DataFrame 和 DataSet 支持 Spark SQL 操作。
DataFrame 每行类型固定为 ROW,不支持直接访问字段值。
DataSet 是强类型的,每行数据类型明确。
RDD、DataFrame 和 DataSet 的相互转换
RDD 转 DataFrame:使用 toDF() 方法。
DataFrame 转 RDD:使用 rdd 属性。
DataFrame 转 DataSet:使用 as[Type] 方法。
DataSet 转 DataFrame:使用 toDF() 方法。
RDD 转 DataSet:使用 toDS() 方法。

相关文章:
Spark-SQL核心编程
简介 Hadoop与Spark-SQL的对比 Hadoop在处理结构化数据方面存在局限性,无法有效处理某些类型的数据。 Spark应运而生,特别设计了处理结构化数据的模块,称为Spark SQL(原称Shark)。 SparkSQL的发展历程: Sp…...
pywebview 常用问题分享
文章目录 前言问题描述与方案(待补充)1、动态设置本地调试目录和打包目录2、构建后运行程序白屏 前言 最近做一个pywebview项目,遇到了一些问题,记录一下,分享给大家,希望能帮助有遇到相似问题的人事。 问题描述与方案(待补充) …...
系统设计模块之安全架构设计(身份认证与授权(OAuth2.0、JWT、RBAC/ABAC))
一、OAuth 2.0:开放授权框架 OAuth 2.0 是一种标准化的授权协议,允许第三方应用在用户授权下访问其资源,而无需直接暴露用户密码。其核心目标是 分离身份验证与授权,提升安全性与灵活性。 1. 核心概念与流程 角色划分ÿ…...
Docker 与 Podman常用知识汇总
一、常用命令的对比汇总 1、基础说明 Docker:传统的容器引擎,使用 dockerd 守护进程。 Podman:无守护进程、无root容器引擎,兼容 Docker CLI。 Podman 命令几乎完全兼容 Docker 命令,只需将 docker 替换为 podman。…...
如何通过自动化解决方案提升企业运营效率?
引言 在现代企业中,运营效率直接影响着企业的成本、速度与竞争力。尤其是随着科技的不断发展,传统手工操作和低效的流程逐渐无法满足企业的需求。自动化解决方案正成为企业提升运营效率、降低成本和提高生产力的关键。无论是大型跨国公司,还…...
unity100天学习计划
以下是一个为期100天的Unity学习大纲,涵盖从零基础到独立开发完整游戏的全流程,结合理论、实践和项目实战,每天学习2-3小时: 第一阶段:基础奠基(Day 1-20) 目标:掌握Unity引擎基础与C#编程 Day 1-5:引擎入门 安装Unity Hub和Unity Editor(LTS版本)熟悉Unity界面:S…...
多坐标系变换全解析:从相机到WGS-84的空间坐标系详解
多坐标系变换全解析:从相机到WGS-84的空间坐标系详解 一、常见坐标系简介二、各坐标系的功能和使用场景1. WGS-84 大地坐标系(经纬高)2. 地心直角坐标系(ECEF)3. 本地 ENU / NED 坐标系4. 平台坐标系(Body)5. 相机坐标系三、坐标变换流程图四、如何选用合适的坐标系?五…...
SpringCloud Alibaba 之分布式全局事务 Seata 原理分析
1. 什么是 Seata?为什么需要它? 想象一下,你去银行转账: 操作1:从你的账户扣款 1000 元操作2:向对方账户增加 1000 元 如果 操作1 成功,但 操作2 失败了,你的钱就凭空消失了&…...
作业帮前端面试题及参考答案 (100道面试题-上)
HTML5 的优势是什么? HTML5 作为 HTML 语言的新一代标准,具有众多显著优势,为现代网页开发带来了诸多便利与革新。 在语义化方面,HTML5 引入了大量具有明确语义的标签,如<header>、<nav>、<article>、<section>、<aside>、<footer>等…...
Large Language Model(LLM)的训练和微调
之前一个偏工程向的论文中了,但是当时对工程理论其实不算很了解,就来了解一下 工程流程 横轴叫智能追寻 竖轴上下文优化 Prompt不行的情况下加shot(提示),如果每次都要加提示,就可以试试知识库增强检索来给提示。 如果希望增强…...
统计销量前十的订单
传入参数: 传入begin和end两个时间 返回参数 返回nameList和numberList两个String类型的列表 controller层 GetMapping("/top10")public Result<SalesTop10ReportVO> top10(DateTimeFormat(pattern "yyyy-MM-dd") LocalDate begin,Dat…...
AI大模型原理可视化工具:深入浅出理解大语言模型的工作原理
AI大模型原理可视化工具:深入浅出理解大语言模型的工作原理 在人工智能快速发展的今天,大语言模型(如GPT、BERT等)已经成为改变世界的重要技术。但对于很多人来说,理解这些模型的工作原理仍然是一个挑战。为了帮助更多…...
MCP 认证考试常见技术难题实战分析与解决方案
MCP(Microsoft Certified Professional)认证考试在全球范围内被广泛认可,是衡量个人在微软技术领域专业能力的重要标准。然而,在备考和参加 MCP 认证考试过程中,考生常常会遇到各种技术难题。以下将对一些常见技术难题进行实战分析,并提供相应的解决方案。 一、网络配…...
qt designer 创建窗体选择哪种屏幕大小
1. 新建窗体时选择QVGA还是VGA 下面这个图展示了区别 这里我还是选择默认,因为没有特殊需求,只是在PC端使用...
Spark-SQL核心编程(一)
一、Spark-SQL 基础概念 1.定义与起源:Spark SQL 是 Spark 用于结构化数据处理的模块,前身是 Shark。Shark 基于 Hive 开发,提升了 SQL-on-Hadoop 的性能,但因对 Hive 依赖过多限制了 Spark 发展,后被 SparkSQL 取代&…...
Android WiFi获取动态IP地址
Android开发中获取WiFi动态IP地址可通过以下方法实现,需结合网络状态管理和API调用: 一、权限配置 在AndroidManifest.xml中添加必要权限: <uses-permission android:name"android.permission.ACCESS_WIFI_STATE" /> <…...
正则表达式使用知识(日常翻阅)
正则表达式使用 一、字符匹配 1. 普通字符 描述:直接匹配字符本身。示例: abc 匹配字符串中的 “abc”。Hello 匹配字符串中的 “Hello”。 2. 特殊字符 .(点号): 描述:匹配任意单个字符(…...
AI与无人驾驶汽车:如何通过机器学习提升自动驾驶系统的安全性?
引言 想象一下,在高速公路上,一辆无人驾驶汽车正平稳行驶。突然,前方的车辆紧急刹车,而旁边车道有一辆摩托车正快速接近。在这千钧一发的瞬间,自动驾驶系统迅速分析路况,判断最安全的避险方案,精…...
第5篇:Linux程序访问控制FPGA端LEDR<三>
Q:如何具体设计.c程序代码访问控制FPGA端外设? A:以控制DE1-SoC开发板的LEDR为例的Linux .C程序代码。头文件fcntl.h和sys/mman.h用于使用/dev/mem文件,以及mmap和munmap内核函数;address_map_arm.h指定了DE1-SoC_Com…...
城市应急安防系统EasyCVR视频融合平台:如何实现多源视频资源高效汇聚与应急指挥协同
一、方案背景 1)项目背景 在当今数字化时代,随着信息技术的飞速发展,视频监控和应急指挥系统在公共安全、城市应急等领域的重要性日益凸显。尤其是在关键场所,高效的视频资源整合与传输能力对于应对突发公共事件、实现快速精准的…...
主流程序员接单平台的分类整理与分析
一、主流推荐平台 1.程序员客栈 特点:国内知名度高,需求池模式自动匹配项目,项目经理介入协调争议,流程规范。 优势:适合新手到资深开发者,资金托管安全性高,交易纠纷处理专业。 不足&…...
【笔记ing】AI大模型-03深度学习基础理论
神经网络:A neural network is a network or circuit of neurons,or in a modern sense,an artificial neural network,composed of artificial neurons or nodes.神经网络是神经元的网络或回路,或者在现在意义上来说,是一个由人工神经元或节…...
Hutool工具包中`copyProperties`和`toBean`的区别
前言 在Java开发中,对象转换是一项常见且重要的操作。Hutool作为一个功能强大的Java工具包,提供了copyProperties和toBean这两个实用的方法来帮助我们进行对象转换。然而,很多开发者对这两个方法的区别和使用场景并不十分清楚。 一、Hutool…...
高德地图 JS-SDK 实现教程
高德地图 JS-SDK 实现教程:定位、地图选点、地址解析等 适用地点选择、地址显示、表单填写等场景,全面支持移动端、手机浏览器和 PC端环境 一、创建应用&Key 前端(JS-SDK、地图组件) 登陆 高德开放平台创建应用,…...
07软件测试需求分析案例-修改用户信息
修改用户信息是后台管理菜单的一个功能模块,只有admin才有修改权限。包括查询用户名进行显示用户相关信息,并且修改用户相关信息的功能。 1.1 通读文档 通读需求规格说明书是提取信息,提出问题,输出具有逻辑、规则、流程的业务…...
分层对象模型:PO、DTO、VO、BO定义区别与使用场景
目录 前言 PO(持久化对象) DTO(数据传输对象) VO(视图对象) BO(业务对象) 关键区别总结 典型应用场景 为什么要分层设计 工具支持 前言 在开发中,我们经常遇到…...
设计模式 --- 状态模式
状态模式是一种行为型设计模式,允许对象在内部状态改变时动态改变其行为,使对象的行为看起来像是改变了。该模式通过将状态逻辑拆分为独立类,消除复杂的条件分支语句,提升代码的可维护性和扩展性。 状态模式的…...
Java多态课堂练习题
Java多态课堂练习题 题目:动物乐园的多态展示 背景设定: 设计一个动物乐园程序,展示不同类型动物的行为特点,要求使用多态特性实现。 1. 基础类设计(已给出部分代码) // 基类:动物 abstract…...
SAP系统中的借货
问题:什么是借贷? 解答:记账符号反映的是各种经济业务数量的增加和减少。 二:怎么区分借贷增减? 解答:“借”和“贷”何时为增加、何时为减少,必须结合账户的具体性质才能准确说明…...
深入剖析Go Channel:从底层原理到高阶避坑指南|Go语言进阶(5)
文章目录 引言channel的底层数据结构channel操作原理发送操作(ch <- data)接收操作(<-ch) 常见陷阱及避坑指南1. 死锁问题2. 关闭channel的错误方式3. 内存泄漏4. nil channel特性5. 性能考量 最佳实践总结 引言 Channel是Go语言实现CSP并发模型的核心机制,提…...
