欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > spark-SOL简介

spark-SOL简介

2025/4/19 7:33:05 来源:https://blog.csdn.net/2402_85245931/article/details/147229686  浏览:    关键词:spark-SOL简介

Spark-SQL简介

一.Spark-SQL是什么

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

二.Hive and SparkSQL

SparkSQL 的前身是 Shark,Shark是给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供的快速上手的工具

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

三.Spark-SQL 特点

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

统一的数据访问。使用相同的方式连接不同的数据源

兼容 Hive。在已有的仓库上直接运行 SQL 或者 HQL

标准数据连接。通过 JDBC 或者 ODBC 来连接

四.DataFrame 是什么

左侧的 RDD[Person]虽然以 Person 为类型参数,但 Spark 框架本身不了解 Person 类的内 部结构。而右侧的 DataFrame 却提供了详细的结构信息,使得 Spark SQL 可以清楚地知道 该数据集中包含哪些列,每列的名称和类型各是什么。 DataFrame 是为数据提供了 Schema 的视图。可以把它当做数据库中的一张表来对待 DataFrame 也是懒执行的,但性能上比 RDD 要高,主要原因:优化的执行计划,即查询计 划通过 Spark catalyst optimiser 进行优化

五.DataSet 是什么

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 来表示。获取数据时需要指定顺序

Spark-SQL核心编程(一)

一.创建 DataFrame

在 spark 的 bin/data 目录中创建 user.json 文件

{"username":"zhangsan","age":20}

{"username":"lisi","age":17}

SQL 语法

SQL 语法风格是指我们查询数据的时候使用 SQL 语句来查询,这种风格的查询必须要有临时视图或者全局视图来辅助

读取 JSON 文件创建 DataFrame

对 DataFrame 创建一个临时表

通过 SQL 语句实现查询全表

结果展示

DSL 语法

创建一个 DataFrame

查看 DataFrame 的 Schema 信息

只查看"username"列数据

查看"username"列数据以及"age+1"数据

查看"age"大于"18"的数据

按照"age"分组,查看数据条数

RDD 转换为 DataFrame

在 IDEA 中开发程序时,如果需要 RDD 与 DF 或者 DS 之间互相操作,那么需要引入 import spark.implicits._ 这里的 spark 不是 Scala 中的包名,而是创建的 sparkSession 对象的变量名称,所以必 须先创建 SparkSession 对象再导入。这里的 spark 对象不能使用 var 声明,因为 Scala 只支持 val 修饰的对象的引入。

spark-shell 中无需导入,自动完成此操作。

实际开发中,一般通过样例类将 RDD 转换为 DataFrame

sc.makeRDD(List(("zhangsan",30), ("lisi",40))).map(t=>User(t._1, t._2)).toDF.show

DataFrame 转换为 RDD

DataFrame 其实就是对 RDD 的封装,所以可以直接获取内部的 RDD

创建 DataSet

使用样例类序列创建 DataSet

使用基本类型的序列创建 DataSet

            

RDD 转换为 DataSet

SparkSQL 能够自动将包含有 case 类的 RDD 转换成 DataSet,case 类定义了 table 的结 构,case 类属性通过反射变成了表的列名。Case 类可以包含诸如 Seq 或者 Array 等复杂的结构。


DataFrame 和 DataSet 转换

DataSet 转换为 DataFrame

RDD、DataFrame、DataSet 三者的关系

Spark1.0 => RDD

Spark1.3 => DataFrame

 Spark1.6 => Dataset

三者的共性

RDD、DataFrame、DataSet 全都是 spark 平台下的分布式弹性数据集,为处理超大型数

据提供便利;

三者都有惰性机制,在进行创建、转换,如 map 方法时,不会立即执行,只有在遇到

Action 如 foreach 时,三者才会开始遍历运算;

三者有许多共同的函数,如 filter,排序等;

在对 DataFrame 和 Dataset 进行操作许多操作都需要这个包:

import spark.implicits._(在创建好 SparkSession 对象后尽量直接导入)

三者都会根据 Spark 的内存情况自动缓存运算,这样即使数据量很大,也不用担心会

内存溢出

三者都有分区(partition)的概念

DataFrame 和 DataSet 均可使用模式匹配获取各个字段的值和类型

三者的区别

RDD

 RDD 一般和 spark mllib 同时使用

RDD 不支持 sparksql 操作

2) DataFrame

 与 RDD 和 Dataset 不同,DataFrame 每一行的类型固定为Row,每一列的值没法直

访问,只有通过解析才能获取各个字段的值

DataFrame 与 DataSet 一般不与 spark mllib 同时使用

DataFrame 与 DataSet 均支持 SparkSQL 的操作,比如 select,groupby 之类,还能

注册临时表/视窗,进行 sql 语句操作

DataFrame 与 DataSet 支持一些特别方便的保存方式,比如保存成 csv,可以带上表

头,这样每一列的字段名一目了然

3) DataSet

Dataset 和 DataFrame 拥有完全相同的成员函数,区别只是每一行的数据类型不同。

DataFrame 其实就是 DataSet 的一个特例 type DataFrame = Dataset[Row]

DataFrame 也可以叫 Dataset[Row],每一行的类型是 Row

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词