SparkSQL---简介及RDD V.S DataFrame V.S Dataset编程模型详解

一、SparkSQL简介

SparkSQL,就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL,而叫Shark,最开始的时候底层代码优化,sql的解析、执行引擎等等完全基于Hive,总之Shark的执行速度要比hive高出一个数量级,但是hive的发展制约了Shark,所以在15年中旬的时候,shark负责人,将shark项目结束掉,重新独立出来的一个项目,就是sparksql,不再依赖hive,做了独立的发展,逐渐的形成两条互相独立的业务:SparkSQL和Hive-On-Spark。在SparkSQL发展过程中,同时也吸收了Shark有些的特点:基于内存的列存储,动态字节码优化技术。

二、SparkSQL特点

1、强大的整合能力
可以在spark程序中混合SQL查询操作
2、统一的数据访问接口
使得sparksql可以非常便捷的进行数据访问操作
3、可以读写hive中的数据
对于hive的强大支持,是sparksql重要的能力之一
4、提供了支持JDBC/ODBC
为了方便一些BI组件的调用数据,使得对数据访问变得多元化,功能完整化
总结:
SparkSQL就是Spark生态体系中用于处理结构化数据的一个模块。换句话说,SparkSQL处理的就是二维表数据。
①结构化数据是什么?存储在关系型数据库中的数据,就是结构化数据;
②半结构化数据是什么?类似xml、json等的格式的数据被称之为半结构化数据;
③非结构化数据是什么?音频、视频、图片等为非结构化数据。

三、SparkSQL编程入口和模型

1、SparkSQL编程入口

在SparkSQL中的编程模型,不再是SparkContext,但是创建需要依赖SparkContext。SparkSQL中的编程模型,在spark2.0以前的版本中为SQLContext和HiveContext,HiveContext是SQLContext的一个子类,提供Hive中特有的一些功能,比如row_number开窗函数等等,这是SQLContext所不具备的,在Spark2.0之后将这两个进行了合并——SparkSession。使用工厂构建器(Builder方式)模式创建SparkSession。

	//创建sparkSql程序入口val spark = SparkSession.builder().appName("sparksql").master("local[*]").enableHiveSupport()//开启hive支持,支持hive的相关操作.getOrCreate()//通过sparkSql程序入口调用SparkContextval sc = spark.sparkContext//设置日志级别sc.setLogLevel("WARN")
2、SparkSQL编程模型

主要通过两种方式操作SparkSQL,一种就是SQL,另一种为DataFrame和Dataset。
people.json数据:
{“name”:“json”,“age”:23,“hobby”:“running”}
{“name”:“charles”,“age”:32,“hobby”:“basketball”}
{“name”:“tom”,“age”:28,“hobby”:“football”}
{“name”:“lili”,“age”:24,“hobby”:“running”}
{“name”:“bob”,“age”:20,“hobby”:“swimming”}

1、SQL
就和Hive操作一样,但是需要清楚一点的是,SQL操作的是表,所以要想用SQL进行操作,就需要将SparkSQL对应的编程模型转化成为一张表才可以。同时支持,通用sql和hivesql。

 	//SQL风格//加载数据val dataFrame = spark.read.json("F:\\test\\people.json")//想要使用SQL风格,必须将数据首先注册为一张表dataFrame.createOrReplaceTempView("person")//查询所有数据spark.sql("select * from person").show()//查询age和name,并将age+10岁spark.sql("select name,age+10 as age from  person").show()//查询name和age,只要age>30的val sql="""|select * from person where age>30""".stripMarginspark.sql(sql).show()

2、DSL(DataFrame&DataSet)
为方便大家使用函数式编程的思想,类似sparkcore的编程模式,sparksql也支持DSL(Domain Specified Language,领域专用语言,或者特定领域语言),即通过DataFrame和Dataset来支持类似RDD的编程。
DataFrame和Dataset是SparkSQL中的编程模型。DataFrame和Dataset我们都可以理解为是一张mysql中的二维表,表有什么?表头,表名,字段,字段类型。RDD其实说白了也是一张二维表,但是这张二维表相比较于DataFrame和Dataset却少了很多东西,比如表头,表名,字段,字段类型,只有数据。
一般的,将RDD称之为Spark体系中的第一代编程模型;DataFrame比RDD多了一个Schema元数据信息,被称之为Spark体系中的第二代编程模型;Dataset吸收了RDD的优点(强类型推断和强大的函数式编程)和DataFrame中的优化(SQL优化引擎,内存列存储),成为Spark的最新一代的编程模型。

	//DSL风格(领域专用语言),就是通过dataFrame和Dataset来支持类似RDD的编程,调用函数//加载数据val dataFrame = spark.read.json("F:\\test\\people.json")//查询name,hobbydataFrame.select("name","hobby").show()//需要导包import spark.implicits._//查询name和age,只要age>30岁的人dataFrame.select("name","age").filter($"age">30).show()//查询age,并将每个age+10岁dataFrame.select($"age",$"age"+10 as "age1").show()
3、RDD V.S DataFrame V.S Dataset

1、RDD
弹性分布式数据集,是Spark对数据进行的一种抽象,可以理解为Spark对数据的一种组织方式,更简单些说,RDD就是一种数据结构,里面包含了数据和操作数据的方法。
RDD是Spark最底层的抽象,目前是开发者用的最多的,但逐步会转向DataFrame和Dataset(当然,这是Spark的发展趋势)调整。
2、DataFrame
DataFrame在RDD的基础上加了Schema(描述数据的信息,可以认为是元数据,DataFrame曾经就有个名字叫SchemaRDD)
假设RDD中的两行数据长这样
在这里插入图片描述
那么DataFrame中的数据长这样
在这里插入图片描述
DataFrame比RDD多了一个表头信息(Schema),像一张表了,DataFrame还配套了新的操作数据的方法,DataFrame API(如df.select())和SQL(select id, name from xx_table where …)。
通过DataFrame API或SQL处理数据,会自动经过Spark 优化器(Catalyst)的优化,即使你写的程序或SQL不高效,也可以运行的很快。
3、Dataset
Dataset提供了强类型支持,也是在RDD的每行数据加了类型约束
假设RDD中的两行数据长这样
在这里插入图片描述
那么Dataset中的数据长这样
在这里插入图片描述
或者也可以是这样,其中每行数据是个Object
在这里插入图片描述
相比DataFrame,Dataset提供了编译时类型检查,对于分布式程序来讲,提交一次作业太费劲了(要编译、打包、上传、运行),到提交到集群运行时才发现错误,实在是不方便,这也是引入Dataset的一个重要原因。

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

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

相关文章

2024年水资源保护盛事,“澜湄周”邀请国信华源加入!

4月26日,2024年水资源领域“澜湄周”活动在北京举行。水利部国科司、外交部亚洲司和边海司、湄公河五国驻华使馆以及澜湄水资源合作单位的代表嘉宾出席活动。北京国信华源公司特邀参加,现场就深化澜湄水资源合作展开深入交流研讨。 澜湄六国,…

2022-2003年上市公司企业商业信用融资数据

01、数据简介 企业商业信用融资是指企业之间在买卖商品时,以商品形式提供的借贷活动。这种融资方式是经济活动中一种最普遍的债权债务关系。商业信用的存在对于扩大生产和促进流通起到了十分积极的作用,但不可避免的也存在着一些消极的影响。 测算方式…

使用 LooperPrinter 监控 Android 应用的卡顿

在 Android 开发中,主线程(UI线程)的卡顿直接影响用户体验。LooperPrinter 是一种有效的工具,可以帮助我们监测和识别这些卡顿。下面是如何实现 LooperPrinter 监控的详细步骤和相应的 Kotlin 代码示例。 步骤 1: 创建自定义的 P…

牛客JZ47 礼物的最大价值【中等 动态规划 C++/Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/2237b401eb9347d282310fc1c3adb134 思路 动态规划: 每个单元格依赖于他的上边a和左边b,单元格的值为max(a,b)自己的值参考答案C class Solution {public:/*** 代码中的类名、方法名、参…

京东web京东,m端滑块,h5st4.2,4.3,4.7

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章未…

力扣33. 搜索旋转排序数组

Problem: 33. 搜索旋转排序数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化左右指针:首先,定义两个指针left和right,分别指向数组的开始和结束位置。 2.计算中间值:在left和right之间找到中间位置mid。 3.比较中间值…

strstr,strnstr函数详解

strstr函数 strstr函数是C语言中的一个字符串函数,用于在一个字符串中查找另一个字符串的出现位置。 它的函数原型如下: char *strstr(const char *haystack, const char *needle); 在这个函数中,haystack表示被搜索的字符串,…

【多态】有关多继承和菱形继承的多态

博主首页: 有趣的中国人 专栏首页: C进阶 其它专栏: C初阶 | 初阶数据结构 | Linux 博主会持续更新 本篇文章主要讲解 多继承和菱形继承的多态 的相关内容 文章目录 1. 回顾多态底层2. 抽象类2.1 概念2.2 接口继承和实现继承 3. 虚表所在…

Linux——web建立wordpress

下载 [rootnfs-server ~]# yum install php wget https://wordpress.org/latest.tar.gz解压 /var/www/html [rootnfs-server html]# tar -xzvf latest.tar.gz [rootnfs-server html]# rm latest.tar.gz授权 [rootnfs-server html]# chown -R www:www /var/www/html添加文件备…

利用kimi等大模型进行运维参数解析和调优

在运维时,经常遇到很多参数,有些参数不知道意义,知道意义的也有些不知道合理参考值是多少。利用kimi等大模型来当老司机,轻松解决运维难题。 例如在运维hive参数时,有些不知道作用,提示次如下 你的角色是…

windows ubuntu sed,awk,grep篇:7.sed 多行模式及循环

目录 46.读取下一行数据并附加到模式空间(命令 N) 47.打印多行模式中的第一行(命令 P) 48. 删除多行模式中的第一行(命令 D) 49.循环和分支(命令 b 和 :label 标签) 50.使用命令 t 进行循环 Sed 默认每次只处理一行数据,除非使用 H,G 或者 N 等命令创建多行模式&…

python学习笔记B-11:序列结构之列表--二维列表的遍历和生成式

二维列表的遍历方式,使用双层for循环,遍历索引号。 二维列表的生成式,也是使用类似双层循环的形式生成。 print("##初始化二维列表,每个元素就是1个列表") lst [["东方延续","太空军自然选择号舰长&qu…

释放Stable Diffusion 无限可能

最近在整理大语言模型的系列内容,Stable Diffusion 是我下一篇博客的主题。关注 Stable Diffusion,是因为它是目前最受欢迎和影响力最大的多模态生成模型之一。Stable Diffusion 于 2022 年 8 月发布,主要用于根据文本的描述产生详细图像&…

基于SpringBoot+Vue笔记记录分享网站设计与实现

项目介绍: 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代…

C语言 | Leetcode C语言题解之第50题Pow(x,n)

题目&#xff1a; 题解&#xff1a; double myPow(double x, int n){if(n 0 || x 1){return 1;}if(n < 0){return 1/(x*myPow(x,-(n1)));}if(n % 2 0){return myPow(x*x,n/2);}else{return x*myPow(x*x,(n - 1)/2);} }

【Jenkins】持续集成与交付 (三):有关报错解决(Jenkins (2.387.3) or higher required)

🟣【Jenkins】持续集成与交付 (三):有关报错解决Jenkins (2.387.3) or higher required 一、Jenkins主页报错二、安装Jenkins插件报错三、解决过程(解压替换jenkins.war)四、重新访问登录💖The Begin💖点点关注,收藏不迷路💖 一、Jenkins主页报错 New version …

吴恩达2022机器学习专项课程(一)7.2 逻辑回归的简化成本函数

问题预览/关键词 本节课内容逻辑回归的损失函数简化之后的形式是&#xff1f;为什么可以简化&#xff1f;成本函数的通用形式是&#xff1f;逻辑回归成本函数的最终形式是&#xff1f;逻辑回归为什么用对数损失函数计算成本函数&#xff1f;为什么不直接给出逻辑回归损失函数的…

[详解]Spring AOP

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 什么是AOP? Spring AOP 快速入门 Spring AOP核心概念 切点(Point…

selenium 4.x入门篇(环境搭建、八大元素定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试&#xff0c;还需要记录、调试网页的细节 一、selenium4.x环境搭建 一键搭建 pip3 install webdriver-helper 安装后自动的完成&#xff1a; 1. 查看浏览器的版本号 2. 查询操作系统的类型…

【智能优化算法】蚱蜢优化算法(Grasshopper Optimization Algorithm,GOA)

蚱蜢优化算法(Grasshopper Optimization Algorithm&#xff0c;GOA)是期刊“IEEE Access”&#xff08;IF 3.9&#xff09;的2021年智能优化算法 01.引言 蚱蜢优化算法(Grasshopper optimization algorithm, GOA)&#xff0c;并将其应用于结构优化中的挑战性问题。该算法在数学…