详解 Spark SQL 核心编程知识

一、SparkSQL 概述

1. 概念

Spark SQL 是 Spark 用于结构化数据 (structured data) 处理的 Spark 模块,使用 SQL 的方式简化 RDD 的开发

2. Hive VS SparkSQL

  • Hive 是早期唯一运行在 Hadoop 上的 SQL-on-Hadoop 工具,但是 MapReduce 计算过程中大量的中间磁盘落地过程消耗了大量的 I/O,降低的运行效率
  • Shark 是为了提高 SQL-on-Hadoop的效率而产生的 SQL-on-Hadoop 工具,是基于 Hive 所开发的,它修
    改了 Hive 中的内存管理、物理计划和执行三个模块,并使之能运行在 Spark 引擎上
  • 由于 Shark 对于 Hive 存在太多依赖(如采用 Hive 的语法解析器、查询优化器等等),制约了其发展,SparkSQL 由此应运而生,它抛弃了原有 Shark 的代码,但汲取了 Shark 的一些优点,如内存列存储(In-Memory Columnar Storage)、 Hive 兼容性等
    • 数据兼容方面 SparkSQL 不但兼容 Hive,还可以从 RDD、parquet 文件、JSON 文件中获取数据,未来版本甚至支持获取 RDBMS 数据以及 cassandra 等 NOSQL 数据
    • 性能优化方面 除了采取 In-Memory Columnar Storage、byte-code generation 等优化技术外、将会引进 Cost Model 对查询进行动态评估、获取最佳物理计划等等
    • 组件扩展方面 无论是 SQL 的语法解析器、分析器还是优化器都可以重新定义,进行扩展
  • Shark 停止开发后,发展出了两个支线,其中 SparkSQL 作为 Spark 生态的一员继续发展,而不再受限于 Hive,只是兼容 Hive;而 Hive on Spark 是一个 Hive 的发展计划,该计划将 Spark 作为 Hive 的底层引擎之一,由此 Hive 将不再受限于一个引擎,可以采用 Map-Reduce、Tez、Spark 等引擎

3. SparkSQL 特点

  • 易整合:无缝的整合了 SQL 查询和 Spark 编程
  • 统一的数据访问:使用相同的方式连接不同的数据源
  • 兼容 Hive:在已有的仓库上直接运行 SQL 或者 HiveQL
  • 标准数据连接:通过 JDBC 或者 ODBC 来连接

4. 两大数据模型

  • DataFrame:一种以 RDD 为基础的分布式数据集,类似于传统数据库中的二维表格
  • DataSet:是 Spark 1.6 中添加的一个新抽象,是 DataFrame 的一个扩展

二、SparkSQL 核心编程

1. 上下文对象

  • SparkCore 中执行应用程序前构建的上下文环境对象为 SparkContext
  • SparkSQL 中执行应用程序前构建的上下文环境对象为:
    • 老版本:SQLContext,用于 Spark 自己提供的 SQL 查询;HiveContext,用于连接 Hive 的查询
    • 新版本:SparkSession,实质上是 SQLContext 和 HiveContext 的组合,内部封装了 SparkContext

2. DataFrame

2.1 介绍
  • DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中的二维表格。与 RDD 的主要区别在于,DataFrame 带有 schema 元信息,即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型
  • 与 Hive 类似,DataFrame 也支持嵌套数据类型(struct、array 和 map)
  • DataFrame 是为数据提供了 Schema 的视图,可以把它当做数据库中的一张表来看待
  • DataFrame 是懒执行的,但性能上比 RDD 要高,主要原因:优化的执行计划,即查询计划通过 Spark catalyst optimiser 进行优化
2.2 创建
2.2.1 从 Spark 数据源创建
/**
	基本语法:SparkSession.read.[data_format]
	可用的数据源格式:csv format jdbc json load option options orc parquet schema table text textFile
*/
// 从一个 json 文件中创建 DataFrame
val df = sparkSession.read.json("data/user.json")

// 展示 DataFrame 数据
df.show()
2.2.2 从 RDD 创建
/**
	基本语法:RDD.toDF(col1, col2, ...)
	注意:
		1.必须先创建 SparkSession 对象,使用 val 修饰且命名为 spark
		2.引入:import spark.implicits._  (此处的 spark 为 SparkSession 对象)
*/
val rdd = sc.makeRDD(List(1,2,3,4))
val df = rdd.toDF("id")
df.show()

//使用样例类
case class User(val name: String, val age: Int)

val rdd1 = sc.makeRDD(List(
	("tom", 18), ("jerry", 17)
)).map(t => User(t._1, t._2))

rdd1.toDF.show

// DataFrame 转换为 RDD
val rdd2: RDD[org.apache.spark.sql.Row] = df.rdd

2.2.3 从 Hive Table 创建
/**
	基本语法:SparkSession.sql("select * from hive_table")
	
*/
val df = sparkSession.sql("select * from user")
df.show()

2.3 SQL 语法
// 1.创建临时视图
// 1.1 session 范围有效
df.createTempView("user")
df.createOrReplaceTempView("user")

// 1.2 应用范围有效
df.createGlobalTempView("emp")
df.createOrReplaceGlobalTempView("emp")

// 2.使用 SQL 语法查询视图
sparkSession.sql("select * from user").show()
// 访问全局视图需要加上 global_temp 前缀
sparkSession.newSession().sql("select * from global_temp.emp").show()

2.4 DSL 语法

domain-specific language,可以直接在 DataFrame 中管理结构化的数据

// 1.查看 DataFrame 的 Schema 信息
df.printSchema()

// 2.查看某列数据
df.select("username").show()
// 2.1 查看某列计算后的数据:涉及到运算的时候,每列都必须使用 $ 或者单引号表达式
// 注意:必须先创建 SparkSession 对象,使用 val 修饰且命名为 spark,然后 import spark.implicits._
df.select($"age" + 1).show()
df.select($"username", $"age" + 1).show()
df.select('username, 'age + 1).show()

// 3.按条件查询数据
df.filter('age > 20).show()

// 4.分组计数
df.groupBy("age").count().show()


3. DataSet

3.1 介绍
  • DataSet 是具有强类型的数据集合,需要提供对应的类型信息,比如 DataSet[Car],DataSet[Person]
  • DataSet 是 DataFrame API 的一个扩展,是 SparkSQL 最新的数据抽象
  • 用户友好的 API 风格,既具有类型安全检查也具有 DataFrame 的查询优化特性
  • 用样例类来对 DataSet 中定义数据的结构信息,样例类中每个属性的名称直接映射到 DataSet 中的字段名称
  • DataFrame 是 DataSet 的特列,DataFrame = DataSet[Row] ,所以可以通过 as 方法将 DataFrame 转换为 DataSet。Row 是一个类型,跟 Car、Person 这些的类型一样,所有的表结构信息都用 Row 来表示。获取数据时需要指定顺序
3.2 创建
3.2.1 从序列创建
/**
	基本语法:List/Seq.toDS()
*/
// 1.基本类型序列创建
val list = List(1,2,3,4)
val ds = list.toDS()
ds.show()

// 2.样例类序列创建
case class Person(name: String, age: Int)
val list1 = List(Person("tom", 20), Person("jerry", 18))
val ds1 = list1.toDS()
ds1.show()

3.2.2 从 RDD 创建
/**
	基本语法:RDD.toDS(),最好使用样例类类型的 RDD
	DataSet 转成 RDD:DataSet.rdd()
*/
case class Person(name: String, age: Int)

val rdd = sc.makeRDD(Person("tom", 20), Person("jerry", 18))

val ds = rdd.toDS()
ds.show()

val rdd1 = ds.rdd()
3.2.3 从 DataFrame 创建
/**
	基本语法:DataFrame.as[Class]
	DataSet 转成 DataFrame:DataSet.toDF
*/
val df = sc.makeRDD(List(
	("tom", 20), ("jerry", 18)
)).toDF("name", "age")

df.show()

// 定义样例类型
case class Person(name: String, age: Int)

val ds = df.as[Person]
ds.show()

val df1 = ds.toDF()
df1.show()

4. RDD/DataFrame/DataSet 的关系

在这里插入图片描述

  • RDD 产生于 Spark1.0 版本,DataFrame 产生于 Spark1.3 版本,Dataset 产生于 Spark1.6 版本
  • 三者都是 Spark 平台下的分布式弹性数据集,为处理超大型数据提供便利,都有惰性机制,都会根据 Spark 的内存情况自动缓存运算,都有 partition 的概念
  • RDD 不支持 SparkSQL 操作,而 DataFrame 与 DataSet 均支持 SparkSQL 的操作;DataFrame 其实是 DataSet 的一个特例

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java高并发实战<2>

##>>> 我们解决我们重复下单的问题 我们可以使用mysql 的唯一索引 ,在我们的数据库层面保证不能重复下单 我可以控制是唯一的 同一个用户 针对于同一个商品只可以买一个 重复下单 优化 我们 >1.使用数据库唯一索引 一旦是 2个请求 因为mysql 有行级…

万物皆有定数

前段时间,测算一个女孩的婚姻,她年底或明年必有婚姻,因为蛇冲猪日,冲动夫宫,就有婚姻出现。不过,按照她总体八字分析,是要晚婚的,但这个运已到,所以,就要允许…

【文献阅读】汽车上的信息安全工程

文章目录 前言 基本概念 信息安全评估 信息安全措施 测试验证 参考文献 前言 见《汽车电子——产品标准规范汇总和梳理(信息安全)》 基本概念 道路车辆信息安全 cybersecurity 使资产受到充分保护,免受道路车辆相关项、其功能及其电气或…

运放的自激振荡问题

运放的自激振荡指的是当运算放大器加电后,在没有外部信号输入的情况下,输出端会出现高频类似于正弦波的波形。 运算放大器产生自激的原因以及解决办法-CSDN博客 a)当振荡由分布电容、电感等引起时,可通过反馈端并联电容,抵消影响…

Java web应用性能分析之【java进程问题分析工具】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 前面大概讲了java进程问题分析流程,这里再小结一下分析工具,后面也会小结一下java进程问题分析定位。 1.分析工具 1.1.linux命令工具 参考:Java web应用性能分析之【Linux服务器性…

汪小菲直播翻车亲儿子直言麻六记有异味网友热议引爆话题

汪小菲直播翻车!亲儿子直言“麻六记”有“异味”,网友热议引爆话题在星光璀璨的娱乐圈,汪小菲一直以家庭幸福、事业有成的形象示人。然而,近日的一场直播让他遭遇了前所未有的尴尬。在直播中,汪小菲兴致勃勃地向观众跨…

创新实训2024.05.29日志:评测数据集与baseline测试

1. 评测工作 在大模型微调和RAG工作都在进行的同时,我们搭建了一套评测数据集。这套数据集有山东大学周易研究中心背书。主要考察大模型对于易学基本概念与常识的理解与掌握能力。 1.1. 构建评测集 在周易研究中心的指导下,我们构建出了一套用以考察大…

Linux系统下+jmeter分布式压测

一.配置jdk(Linux机都需配置同一个版本) 下载Linux系统的jdk,下载地址:https://repo.huaweicloud.com/java/jdk/ 下载后的jdk文件上传到 /opt目录下 进入opt目录,查看jdk文件 cd /opt ll 1.解压文件 tar xzvf jd…

为什么改变进制传输系统码长不变

目录 直接上图片 问题分析 传信率与传码率 多进制调制 码长不变的理解 误码率考量 总结 直接上图片 问题分析 在讨论这个问题时,通常是指在保持RB(码元传输速率,传码率,符号率,波特率)不变的情况下&a…

R语言探索与分析-美国房价及其影响因素分析

一、选题背景 以多元线性回归统计模型为基础,用R语言对美国部分地区房价数据进行建模预测,进而探究提高多元回 归线性模型精度的方法。先对数据进行探索性预处理,随后设置虚拟变量并建模得出预测结果,再使用方差膨胀因子对 多重共…

关于IDEA创建Maven一直爆红无法下载的问题

你能看到这我就知道你肯定已经试过了网上的很多方法了,我之前也是,试过了很多一直无法正常下载,我也是找人给 线下看了看解决了,我总结一下从头到尾排除问题,试到最后要是还解决不了你直接私信我,我给你看看…

【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积

【LeetCode刷题】Day 15 题目1:742.寻找数组的中心下标思路分析:思路1:前缀和思想 题目2:238.除自身以外数组的乘积思路分析思路1:前缀和思想 题目1:742.寻找数组的中心下标 思路分析: 其实题干…

时间序列的谱分解

refer:15.pdf (berkeley.edu) Stat 153 Fall 2010 (berkeley.edu)

xLSTM: Extended Long Short-Term Memory

更多内容,请关注微信公众号:NLP分享汇 原文链接:xLSTM: Extended Long Short-Term Memory 论文链接:https://arxiv.org/pdf/2405.04517 为什么要在27年后提出新的LSTM呢? LSTM(长短期记忆网络&#xff09…

18 EEPROM读写

EEPROM 简介 EEPROM (Electrically Erasable Progammable Read Only Memory,E2PROM)即电可擦除可编程只读存储器,是一种常用的非易失性存储器(掉电数据不丢失),EEPROM 有多种类型的产品,此次实验使用的是A…

车载软件架构 - AUTOSAR 的信息安全框架

车载软件架构 - AUTOSAR 的信息安全架构 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗…

处理一对多的映射关系

一对多关系&#xff0c;比如说根据id查询一个部门的部门信息及部门下的员工信息 在Dept类中先添加List emps属性 1、collection DeptMapper.xml文件中 <resultMap id"deptAndEmpResultMap" type"Dept"><id property"did" column&qu…

国内外主流大模型语言技术大比拼

国内外主流大模型语言技术对比 2024 自2017年起&#xff0c;美国深度布局人工智能&#xff0c;全面融入经济、文化与社会。至2023年&#xff0c;中国凭借自研技术平台崭露头角&#xff0c;ChatGPT及其技术成国家战略焦点&#xff0c;引领未来科技浪潮。中美竞逐&#xff0c;人工…

crossover软件是干什么的 crossover软件安装使用教程 crossover软件如何使用

CrossOver 以其出色的跨平台兼容性&#xff0c;让用户在Mac设备上轻松运行各种Windows软件&#xff0c;无需复杂的设置或额外的配置&#xff0c;支持多种语言&#xff0c;满足不同国家和地区用户的需求。 CrossOver 软件是干嘛的 使用CrossOver 不必购买Windows 授权&#xf…

【JAVA WEB实用与优化技巧】Maven自动化构建与Maven 打包技巧

文章目录 一、MavenMaven生命周期介绍maven生命周期命令解析 二、如何编写maven打包脚本maven 配置详解setting.xml主要配置元素setting.xml 详细配置 使用maven 打包springboot项目maven 引入使用package命令来打包idea打包 三、使用shell脚本自动发布四、使用maven不同环境配…