Spark(14):SparkSQL之概述

news2025/1/11 8:11:19

目录

0. 相关文章链接

1. SparkSQL是什么

2. Hive and SparkSQL

3. SparkSQL 特点

3.1. 易整合

3.2. 统一的数据访问

3.3. 兼容Hive

3.4. 标准数据连接

4. DataFrame 是什么

5. DataSet 是什么

6. SparkSQL的运行环境


0. 相关文章链接

 Spark文章汇总 

1. SparkSQL是什么

Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。

2. Hive and SparkSQL

        SparkSQL 的前身是 Shark,给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供快速上手的工具。 Hive 是早期唯一运行在 Hadoop 上的 SQL-on-Hadoop 工具。但是 MapReduce 计算过程中大量的中间磁盘落地过程消耗了大量的 I/O,降低的运行效率,为了提高 SQL-on-Hadoop 的效率,大量的 SQL-on-Hadoop 工具开始产生,其中表现较为突出的是: 

  • Drill 
  • Impala 
  • Shark 

        其中 Shark 是伯克利实验室 Spark 生态环境的组件之一,是基于 Hive 所开发的工具,它修改了下图所示的右下角的内存管理、物理计划、执行三个模块,并使之能运行在 Spark 引擎上。 

Shark 的出现,使得 SQL-on-Hadoop 的性能比 Hive 有了 10-100 倍的提高。 

        但是,随着 Spark 的发展,对于野心勃勃的 Spark 团队来说,Shark 对于 Hive 的太多依赖(如采用 Hive 的语法解析器、查询优化器等等),制约了 Spark 的 One Stack Rule Them All 的既定方针,制约了 Spark 各个组件的相互集成,所以提出了 SparkSQL 项目。SparkSQL 抛弃原有 Shark 的代码,汲取了 Shark 的一些优点,如内存列存储(In-Memory Columnar Storage)、Hive兼容性等,重新开发了SparkSQL代码;由于摆脱了对Hive的依赖性,SparkSQL 无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便,真可谓“退一步,海阔天空”。

  • 数据兼容方面:SparkSQL 不但兼容 Hive,还可以从 RDD、parquet 文件、JSON 文件中获取数据,未来版本甚至支持获取 RDBMS 数据以及 cassandra 等 NOSQL 数据; 
  • 性能优化方面:除了采取 In-Memory Columnar Storage、byte-code generation 等优化技术外、将会引进 Cost Model 对查询进行动态评估、获取最佳物理计划等等; 
  • 组件扩展方面:无论是 SQL 的语法解析器、分析器还是优化器都可以重新定义,进行扩展。 

        2014 年 6 月 1 日 Shark 项目和 SparkSQL 项目的主持人 Reynold Xin 宣布:停止对 Shark 的开发,团队将所有资源放 SparkSQL 项目上,至此,Shark 的发展画上了句话,但也因此发展出两个支线:SparkSQL 和 Hive on Spark。 

        其中 SparkSQL 作为 Spark 生态的一员继续发展,而不再受限于 Hive,只是兼容 Hive;而Hive on Spark 是一个 Hive 的发展计划,该计划将 Spark 作为 Hive 的底层引擎之一,也就是说,Hive 将不再受限于一个引擎,可以采用 Map-Reduce、Tez、Spark 等引擎。 

        对于开发人员来讲,SparkSQL 可以简化 RDD 的开发,提高开发效率,且执行效率非常快,所以实际工作中,基本上采用的就是 SparkSQL。Spark SQL 为了简化 RDD 的开发,提高开发效率,提供了 2 个编程抽象(DataFrame和DataSet),类似 Spark Core 中的 RDD 。

3. SparkSQL 特点

3.1. 易整合

无缝的整合了 SQL 查询和 Spark 编程

3.2. 统一的数据访问

使用相同的方式连接不同的数据源

3.3. 兼容Hive

在已有的仓库上直接运行 SQL 或者 HiveQL

3.4. 标准数据连接

通过 JDBC 或者 ODBC 来连接

4. DataFrame 是什么

        在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame 与 RDD 的主要区别在于,前者带有 schema 元信息,即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型。这使得 Spark SQL 得以洞察更多的结构信息,从而对藏于 DataFrame 背后的数据源以及作用于 DataFrame 之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。反观 RDD,由于无从得知所存数据元素的具体内部结构,Spark Core 只能在 stage 层面进行简单、通用的流水线优化。 

        同时,与 Hive 类似,DataFrame 也支持嵌套数据类型(struct、array 和 map)。从 API 易用性的角度上看,DataFrame API 提供的是一套高层的关系操作,比函数式的 RDD API 要更加友好,门槛更低。 

DataFrame 和 RDD 的区别

        左侧的 RDD[Person]虽然以 Person 为类型参数,但 Spark 框架本身不了解 Person 类的内部结构。而右侧的 DataFrame 却提供了详细的结构信息,使得 Spark SQL 可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。 

        DataFrame 是为数据提供了 Schema 的视图。可以把它当做数据库中的一张表来对待 DataFrame 也是懒执行的,但性能上比 RDD 要高,主要原因:优化的执行计划,即查询计划通过 Spark catalyst optimiser 进行优化。比如下面一个例子: 

        为了说明查询优化,我们来看上图展示的人口数据分析的示例。图中构造了两个DataFrame,将它们 join 之后又做了一次 filter 操作。如果原封不动地执行这个执行计划,最终的执行效率是不高的。因为 join 是一个代价较大的操作,也可能会产生一个较大的数据集。如果我们能将 filter 下推到 join 下方,先对 DataFrame 进行过滤,再 join 过滤后的较小的结果集,便可以有效缩短执行时间。而 Spark SQL 的查询优化器正是这样做的。简而言之,逻辑查询计划优化就是一个利用基于关系代数的等价变换,将高成本的操作替换为低成本操作的过程。  

5. DataSet 是什么

        DataSet 是分布式数据集合。DataSet 是 Spark 1.6 中添加的一个新抽象,是 DataFrame 的一个扩展。它提供了 RDD 的优势(强类型,使用强大的 lambda 函数的能力)以及 Spark SQL 优化执行引擎的优点。DataSet 也可以使用功能性的转换(操作 map,flatMap,filter 等等)。 

  • DataSet 是 DataFrame API 的一个扩展,是 SparkSQL 最新的数据抽象 
  • 用户友好的 API 风格,既具有类型安全检查也具有 DataFrame 的查询优化特性; 
  • 用样例类来对 DataSet 中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet 中的字段名称; 
  • DataSet 是强类型的。比如可以有 DataSet[Car],DataSet[Person]。 
  • DataFrame 是 DataSet 的特列,DataFrame=DataSet[Row] ,所以可以通过 as 方法将DataFrame 转换为 DataSet。Row 是一个类型,跟 Car、Person 这些的类型一样,所有的表结构信息都用 Row 来表示。获取数据时需要指定顺序 

6. SparkSQL的运行环境

        Spark Core 中,如果想要执行应用程序,需要首先构建上下文环境对象 SparkContext, Spark SQL 其实可以理解为对 Spark Core 的一种封装,不仅仅在模型上进行了封装,上下文环境对象也进行了封装。 

        在老的版本中,SparkSQL 提供两种 SQL 查询起始点:一个叫 SQLContext,用于 Spark 自己提供的 SQL 查询;一个叫 HiveContext,用于连接 Hive 的查询。 

        SparkSession 是 Spark 最新的 SQL 查询起始点,实质上是 SQLContext 和 HiveContext 的组合,所以在 SQLContex 和 HiveContext 上可用的 API 在 SparkSession 上同样是可以使用的。SparkSession 内部封装了 SparkContext,所以计算实际上是由 sparkContext 完成的。当我们使用 spark-shell 的时候, spark 框架会自动的创建一个名称叫做 spark 的 SparkSession 对象, 就像我们以前可以自动获取到一个 sc 来表示 SparkContext 对象一样。


注:其他Spark相关系列文章链接由此进 ->  Spark文章汇总 


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

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

相关文章

java pdf加水印

本文将Base64编码形式的pdf文件加水印&#xff0c;并输出完成后的pdf的Base64编码&#xff0c;也可以根据情况自行改动&#xff0c;输出其他形式的内容。 首先引入两个包 <!-- PDF文件依赖包 --><dependency><groupId>com.itextpdf</groupId><arti…

计算机体系结构基础知识介绍之缓存性能的十大进阶优化之编译器优化和硬件预取(六)

优化七&#xff1a;编译器优化&#xff0c;降低miss率 处理器和主内存之间不断扩大的性能差距促使编译器编写者仔细检查内存层次结构&#xff0c;看看编译时优化是否可以提高性能。再次&#xff0c;研究分为指令缺失的改进和数据缺失的改进。接下来介绍的优化可以在许多现代编…

步入JAVA——环境搭建与项目通览

前言 在这篇文章中&#xff0c;荔枝会介绍如何配置Java后端开发环境并借助一个Java web项目简单介绍一下Java的后端开发逻辑。与python的后端开发逻辑是类似的&#xff0c;Java的后端开发其实也是通过一个个类来实现的。对于像荔枝这种小白白来说&#xff0c;入门的第一个练手J…

java项目之高校四六级报名管理系统(ssm+jsp+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的高校四六级报名管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌…

mysql执行顺序以及为什么别名不能用在 where 后

1、mysql执行顺序 如下&#xff1a; 1. from 阶段 2. where 阶段 3. group by 阶段 4. having 阶段 5. select 阶段 6. order by 阶段 7. limit 阶段 2、为什么别名不能用在 where 后

微信小程序反编译之后运行报错“_typeof3 is not a function”

微信小程序解包之后&#xff0c;在微信开发者工具当中点开调试器&#xff0c;选择Console选项卡&#xff0c;发现左侧的预览界面是空白的&#xff0c;虽然真机调试可以有显示&#xff0c;但是真机预览也是跟左边的界面一样都是空白。之后发现Console里面显示 解决方法&#x…

7.5~7.6学习成果总结

关于封装&#xff0c;满足几个原则&#xff0c;一般的成员变量用privat修饰&#xff0c;仅暴露少量方法获取&#xff0c;如果是内部的操作方法也用private&#xff0c;除非是希望被全局使用&#xff0c;的才考虑用public&#xff0c;如果是进希望被子类用的话可以考虑用protect…

ICG NH2,1686147-55-6,吲哚菁绿氨基,安全性更好,并具有更好的光稳定性

ICG NH2&#xff0c;ICG-Amine&#xff0c;吲哚菁绿氨基|&#xff08;文章编辑来源于&#xff1a;西安凯新生物科技有限公司小编WMJ&#xff09;产品结构式&#xff1a; 对于ICG NH2&#xff08;1686147-55-6&#xff09;我们需要知道这些&#xff1a; CAS号为1686147-55-6&am…

专项练习21

目录 一、选择题 1、下列逻辑表达式的结果为false的是&#xff08;&#xff09; 2、请问以下JS代码输出的结果是什么&#xff1f; 3、以下哪些对象是Javascript内置的可迭代对象&#xff1f; 二、编程题 1、找到数组参数中的最大值并返回。注意&#xff1a;数组中只包含数字 …

16 直线识别拟合角平分线(matlab程序)

1.简述 直线检测是数字图像处理的重要内容,在道路识别,建筑物识别,医学图像分析等领域都有十分重要的应用。通过对已经获得的图像进行边缘检测,然后用Hough变换对边缘检测进行直线检测。该方法简单,受直线中的间隙和噪声影响较小。在Matlab环境下对该方法进行了仿真实验,并对图…

【LLM】Windows本地CPU部署民间版中文羊驼模型(Chinese-LLaMA-Alpaca)踩坑记录

目录 前言 准备工作 Git Python3.9 Cmake 下载模型 合并模型 部署模型 前言 想必有小伙伴也想跟我一样体验下部署大语言模型, 但碍于经济实力, 不过民间上出现了大量的量化模型, 我们平民也能体验体验啦~, 该模型可以在笔记本电脑上部署, 确保你电脑至少有16G运行…

1.4 计算机网络性能

1.4 计算机网络性能 速率带宽延迟/时延(delay或latency)四种分组延迟排队延迟 时延带宽积分组丢失&#xff08;丢包&#xff09;吞吐量/率&#xff08;Throughput&#xff09; 速率 速率即数据率(data rate)或称数据传输速率或比特率(bit rate) 单位时间&#xff08;秒&#x…

为什么我心中TOP1的编程语言是Java?我为什么选择Java?

文章目录 前言优点跨平台性面向对象编程&#xff08;OOP&#xff09;强大的类库和工具支持广泛的应用领域 缺点速度相对较慢内存消耗较大较高的学习曲线 Java 学习路线总结前置知识Web前端基础 后端基础1. Java基础2. 数据库技术3. Web开发技术4. 框架技术5. 服务器部署 其他技…

KKT条件

有两种情况&#xff1a; 原问题是非凸函数原问题是凸函数 &#xff08;1&#xff09;非凸函数 KKT是强对偶的必要条件&#xff0c;而不是充分条件&#xff0c;即KKT不能推出强对偶。 &#xff08;2&#xff09;凸函数 KKT与强对偶互为充要条件。 下面给出具体的KKT条件&a…

数据结构--二叉树的先中后序遍历

数据结构–二叉树的先中后序遍历 二叉树的遍历 层次遍历 层次遍历:基于树的层次特性确定的次序规则 二叉树的递归特性: ①要么是个空二叉树 ②要么就是由“根节点左子树右子树”组成的二叉树 先 \color{red}先 先序遍历&#xff1a; 根 \color{red}根 根左右&#xff08; N \…

springboot 集成log4j日志,需要自定义json格式内容输出方便ES采集

背景 公司需要将服务迁移到K8S环境上&#xff0c;由于目前服务输出的格式不符合ES进行采集的日志格式&#xff0c;所有需要将日志输出的格式进行调整为JSON格式&#xff0c;方便ES采集 遇到的坑 之前是直接配置的输出格式的message为"message": %msg"&#x…

记录一下,linux安装环境步骤。

前文 鉴于之前都是下载压缩包方式安装环境&#xff0c;学习了docker之后&#xff0c;决定将服务器初始化&#xff0c;重新用docker安装相应环境 条件&#xff1a;自己买的阿里云centos系统。单核系统&#xff0c;仅学习使用。 初始化云盘 初始化云盘步骤&#xff1a; 1&…

Perfetto 命令行工具(Android 10 及更高版本)

Perfetto 命令行工具&#xff08;Android 10 及更高版本&#xff09; 1、快速入门1.1 启动跟踪服务1.2 记录跟踪1.2.1 通过 Perfetto UI 记录跟踪1.2.2 通过 cmdline 记录跟踪1.2.3 System Tracing 的系统级应用抓取 2、perfetto 工具2.1 数据源选择2.2 语法参数2.2.1 轻量模式…

数据结构--树和二叉树

目录 1.树的结构及概念1.1树的概念1.2树的相关概念1.3树的表示1.4树在实际中的运用&#xff08;表示文件系统的目录结构&#xff09; 2.二叉树的相关概念2.1概念2.2现实版的二叉树2.3特殊的二叉树2.4二叉树的性质2.5二叉树的存储结构 3.与二叉树有关的习题总结 1.树的结构及概念…

RabbitMQ系列(14)--Topics交换机的简介与实现

1、Topics交换机的介绍 Topics交换机能让消息只发送往绑定了指定routingkey的队列中去&#xff0c;不同于Direct交换机的是&#xff0c;Topics能把一个消息往多个不同的队列发送&#xff1b;Topics交换机的routingkey不能随意写&#xff0c;必须是一个单词列表&#xff0c;并以…