当前位置: 首页 > article >正文

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. 核心概念与流程 角色划分&#xff…...

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)的训练和微调

之前一个偏工程向的论文中了&#xff0c;但是当时对工程理论其实不算很了解&#xff0c;就来了解一下 工程流程 横轴叫智能追寻 竖轴上下文优化 Prompt不行的情况下加shot(提示)&#xff0c;如果每次都要加提示&#xff0c;就可以试试知识库增强检索来给提示。 如果希望增强…...

统计销量前十的订单

传入参数&#xff1a; 传入begin和end两个时间 返回参数 返回nameList和numberList两个String类型的列表 controller层 GetMapping("/top10")public Result<SalesTop10ReportVO> top10(DateTimeFormat(pattern "yyyy-MM-dd") LocalDate begin,Dat…...

AI大模型原理可视化工具:深入浅出理解大语言模型的工作原理

AI大模型原理可视化工具&#xff1a;深入浅出理解大语言模型的工作原理 在人工智能快速发展的今天&#xff0c;大语言模型&#xff08;如GPT、BERT等&#xff09;已经成为改变世界的重要技术。但对于很多人来说&#xff0c;理解这些模型的工作原理仍然是一个挑战。为了帮助更多…...

MCP 认证考试常见技术难题实战分析与解决方案

MCP(Microsoft Certified Professional)认证考试在全球范围内被广泛认可,是衡量个人在微软技术领域专业能力的重要标准。然而,在备考和参加 MCP 认证考试过程中,考生常常会遇到各种技术难题。以下将对一些常见技术难题进行实战分析,并提供相应的解决方案。​ 一、网络配…...

qt designer 创建窗体选择哪种屏幕大小

1. 新建窗体时选择QVGA还是VGA 下面这个图展示了区别 这里我还是选择默认&#xff0c;因为没有特殊需求&#xff0c;只是在PC端使用...

Spark-SQL核心编程(一)

一、Spark-SQL 基础概念 1.定义与起源&#xff1a;Spark SQL 是 Spark 用于结构化数据处理的模块&#xff0c;前身是 Shark。Shark 基于 Hive 开发&#xff0c;提升了 SQL-on-Hadoop 的性能&#xff0c;但因对 Hive 依赖过多限制了 Spark 发展&#xff0c;后被 SparkSQL 取代&…...

Android WiFi获取动态IP地址

Android开发中获取WiFi动态IP地址可通过以下方法实现&#xff0c;需结合网络状态管理和API调用&#xff1a; 一、权限配置 在AndroidManifest.xml中添加必要权限&#xff1a; <uses-permission android:name"android.permission.ACCESS_WIFI_STATE" /> <…...

正则表达式使用知识(日常翻阅)

正则表达式使用 一、字符匹配 1. 普通字符 描述&#xff1a;直接匹配字符本身。示例&#xff1a; abc 匹配字符串中的 “abc”。Hello 匹配字符串中的 “Hello”。 2. 特殊字符 .&#xff08;点号&#xff09;&#xff1a; 描述&#xff1a;匹配任意单个字符&#xff08;…...

AI与无人驾驶汽车:如何通过机器学习提升自动驾驶系统的安全性?

引言 想象一下&#xff0c;在高速公路上&#xff0c;一辆无人驾驶汽车正平稳行驶。突然&#xff0c;前方的车辆紧急刹车&#xff0c;而旁边车道有一辆摩托车正快速接近。在这千钧一发的瞬间&#xff0c;自动驾驶系统迅速分析路况&#xff0c;判断最安全的避险方案&#xff0c;精…...

第5篇:Linux程序访问控制FPGA端LEDR<三>

Q&#xff1a;如何具体设计.c程序代码访问控制FPGA端外设&#xff1f; A&#xff1a;以控制DE1-SoC开发板的LEDR为例的Linux .C程序代码。头文件fcntl.h和sys/mman.h用于使用/dev/mem文件&#xff0c;以及mmap和munmap内核函数&#xff1b;address_map_arm.h指定了DE1-SoC_Com…...

城市应急安防系统EasyCVR视频融合平台:如何实现多源视频资源高效汇聚与应急指挥协同

一、方案背景 1&#xff09;项目背景 在当今数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;视频监控和应急指挥系统在公共安全、城市应急等领域的重要性日益凸显。尤其是在关键场所&#xff0c;高效的视频资源整合与传输能力对于应对突发公共事件、实现快速精准的…...

主流程序员接单平台的分类整理与分析

一、主流推荐平台 1.程序员客栈 特点&#xff1a;国内知名度高&#xff0c;需求池模式自动匹配项目&#xff0c;项目经理介入协调争议&#xff0c;流程规范。 优势&#xff1a;适合新手到资深开发者&#xff0c;资金托管安全性高&#xff0c;交易纠纷处理专业。 不足&…...

【笔记ing】AI大模型-03深度学习基础理论

神经网络&#xff1a;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.神经网络是神经元的网络或回路&#xff0c;或者在现在意义上来说&#xff0c;是一个由人工神经元或节…...

Hutool工具包中`copyProperties`和`toBean`的区别

前言 在Java开发中&#xff0c;对象转换是一项常见且重要的操作。Hutool作为一个功能强大的Java工具包&#xff0c;提供了copyProperties和toBean这两个实用的方法来帮助我们进行对象转换。然而&#xff0c;很多开发者对这两个方法的区别和使用场景并不十分清楚。 一、Hutool…...

高德地图 JS-SDK 实现教程

高德地图 JS-SDK 实现教程&#xff1a;定位、地图选点、地址解析等 适用地点选择、地址显示、表单填写等场景&#xff0c;全面支持移动端、手机浏览器和 PC端环境 一、创建应用&Key 前端&#xff08;JS-SDK、地图组件&#xff09; 登陆 高德开放平台创建应用&#xff0c;…...

07软件测试需求分析案例-修改用户信息

修改用户信息是后台管理菜单的一个功能模块&#xff0c;只有admin才有修改权限。包括查询用户名进行显示用户相关信息&#xff0c;并且修改用户相关信息的功能。 1.1 通读文档 通读需求规格说明书是提取信息&#xff0c;提出问题&#xff0c;输出具有逻辑、规则、流程的业务…...

分层对象模型:PO、DTO、VO、BO定义区别与使用场景

目录 前言 PO&#xff08;持久化对象&#xff09; DTO&#xff08;数据传输对象&#xff09; VO&#xff08;视图对象&#xff09; BO&#xff08;业务对象&#xff09; 关键区别总结 典型应用场景 为什么要分层设计 工具支持 前言 在开发中&#xff0c;我们经常遇到…...

设计模式 --- 状态模式

状态模式​​是一种​​行为型设计模式​​&#xff0c;允许对象在内部状态改变时动态改变其行为​​&#xff0c;使对象的行为看起来像是改变了。该模式通过将状态逻辑拆分为独立类​​&#xff0c;消除复杂的条件分支语句&#xff0c;提升代码的可维护性和扩展性。 状态模式的…...

Java多态课堂练习题

Java多态课堂练习题 题目&#xff1a;动物乐园的多态展示 背景设定&#xff1a; 设计一个动物乐园程序&#xff0c;展示不同类型动物的行为特点&#xff0c;要求使用多态特性实现。 1. 基础类设计&#xff08;已给出部分代码&#xff09; // 基类&#xff1a;动物 abstract…...

SAP系统中的借货

问题&#xff1a;什么是借贷&#xff1f; 解答&#xff1a;记账符号反映的是各种经济业务数量的增加和减少。 二&#xff1a;怎么区分借贷增减&#xff1f; 解答&#xff1a;“借”和“贷”何时为增加、何时为减少&#xff0c;必须结合账户的具体性质才能准确说明…...

深入剖析Go Channel:从底层原理到高阶避坑指南|Go语言进阶(5)

文章目录 引言channel的底层数据结构channel操作原理发送操作(ch <- data)接收操作(<-ch) 常见陷阱及避坑指南1. 死锁问题2. 关闭channel的错误方式3. 内存泄漏4. nil channel特性5. 性能考量 最佳实践总结 引言 Channel是Go语言实现CSP并发模型的核心机制&#xff0c;提…...