Spark-SQL核心编程

news2025/4/17 4:29:03

简介

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() 方法。

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

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

相关文章

Docker 与 Podman常用知识汇总

一、常用命令的对比汇总 1、基础说明 Docker:传统的容器引擎,使用 dockerd 守护进程。 Podman:无守护进程、无root容器引擎,兼容 Docker CLI。 Podman 命令几乎完全兼容 Docker 命令,只需将 docker 替换为 podman。…

Large Language Model(LLM)的训练和微调

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

统计销量前十的订单

传入参数&#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;理解这些模型的工作原理仍然是一个挑战。为了帮助更多…

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 取代&…

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;高效的视频资源整合与传输能力对于应对突发公共事件、实现快速精准的…

【笔记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;是一个由人工神经元或节…

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

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

设计模式 --- 状态模式

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

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

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

OpenCV 图形API(31)图像滤波-----3x3 腐蚀操作函数erode3x3()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用3x3矩形结构元素腐蚀图像。 该函数通过使用中心作为锚点的3x3矩形结构元素来腐蚀源图像。腐蚀操作可以应用多次&#xff08;迭代&#xff0…

AI Agent开发大全第二十八课-MCP实现本地命令调用怎么做的?

开篇 MCP很强大,Client端一旦实现了稳定的连接和执行流程后任Server端随意改动都可兼容,这就是热插拨功能。 如果我们仅仅满足于MCP查点网上资料、读点图片即文字型的功能肯定是不能充分发挥MCP的强大之处的,正应了Google以及Anthropic最近的研究报告上说的:不要再在chat…

A2A协议实现详解及示例

A2A协议概述 A2A (Agent2Agent) 是Google推出的一个开放协议&#xff0c;旨在使AI智能体能够安全地相互通信和协作。该协议打破了孤立智能体系统之间的壁垒&#xff0c;实现了复杂的跨应用自动化。[1] A2A协议的核心目标是让不同的AI代理能够相互通信、安全地交换信息以及在各…

活动图与流程图的区别与联系:深入理解两种建模工具

目录 前言1. 活动图概述1.1 活动图的定义1.2 活动图的基本构成要素1.3 活动图的应用场景 2. 流程图概述2.1 流程图的定义2.2 流程图的基本构成要素2.3 流程图的应用场景 3. 活动图与流程图的联系4. 活动图与流程图的区别4.1 所属体系不同4.2 表达能力差异4.3 使用目的与语境4.4…

图片文本识别OCR+DeepSeekapi实现提取图片关键信息

用到的技术&#xff1a; 通过腾讯OCR文字识别&#xff0c;deepseek的api实现 目录 需求分析&#xff1a; 文字识别&#xff08;OCR&#xff09;具体实现步骤 起步工作 代码编写 deepseek整合消息&#xff0c;返回文本关键信息 起步工作 编写工具类 具体调用实现 具体…

go 通过汇编分析函数传参与返回值机制

文章目录 概要一、前置知识二、汇编分析2.1、示例2.2、汇编2.2.1、 寄存器传值的汇编2.2.2、 栈内存传值的汇编 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中&#xff0c;我们研究了go函数调用时的栈布…

解决Ubuntu Desktop 24.04 VMware中安装后不能全屏显示,只能居中的问题

Ubuntu Desktop 24.04 VMware中安装后不能全屏显示&#xff0c;只能居中。 sudo apt-get install open-vm-tools sudo apt-get install open-vm*