sparkSql
一、spark sql简介:
1、SparkSQL发展:
Shark是一个为spark设计的大规模数据仓库系统,它与Hive兼容
1.0以前: Shark
1.1.x开始:SparkSQL(只是测试性的) SQL
1.3.x: SparkSQL(正式版本)+Dataframe
1.5.x: SparkSQL 钨丝计划
1.6.x: SparkSQL+DataFrame+DataSet(测试版本)
2.x:
- SparkSQL+DataFrame+DataSet(正式版本)
- SparkSQL:还有其他的优化
- StructuredStreaming(DataSet)
spark on hive :这里的hive只做数据的存储,sql由spark来解析并执行。
hive on spark:这里hive用来解析sql语句,spark来执行。
2、spark SQL作用
spark SQL是spark用来操作结构化和半结构化数据的接口。sparkSQL使得针对这些数据的读取和查询变得更加简单高效。
sparkSQL提供了以下三大功能:
(1)从各种结构化数据源中读取数据,如:json、hive、parquet、mysql。
(2)sparkSQL支持在spark程序内使用SQL语句进行数据查询。
(3)sparkSQL支持SQL与常规代码高度整合,包括连接RDD与SQL表、公开的自定义SQL函数接口等。
sparkSQL提供了特殊的RDD-----DataFrame,原来的名字叫ShemaRDD。DataFrame是存放Row对象的RDD,每个Row对象代表一行记录。DataFrame还包含记录的结构信息(即数据字段)。
DataFrame看起来和普通的RDD很像,但在内部可以利用结构信息更加高效的存储数据,并支持SQL操作。DataFrame可以从外部数据源创建,也可以从查询结果、普通RDD中创建。
3、连接spark SQL
包含hive支持的spark SQL可以支持 HIVE表访问、UDF(用户自定义函数)、SerDe(序列化格式和反序列化格式)、Hive查询语言(HQL)。
pom.xml引入依赖
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.11</artifactId> <version>2.2.0</version> </dependency>
spark SQL入口有两种:根据是否使用 Hive 支持,有两个不同的入口。HiveContext 和 SQLContext。推荐使用HiveContext ,因为HQL语言资料比较齐全,各方面都好。
4、SparkSQL 的元数据
1、元数据的状态
SparkSQL 的元数据的状态有两种:
1、in_memory,用完了元数据也就丢了
2、hive , 通过hive去保存的,也就是说,hive的元数据存在哪儿,它的元数据也就存在哪儿。
换句话说,SparkSQL的数据仓库在建立在Hive之上实现的。我们要用SparkSQL去构建数据仓库的时候,必须依赖于Hive。
2、Spark-SQL脚本
如果用户直接运行bin/spark-sql命令。会导致我们的元数据有两种状态:
1、in-memory状态:如果SPARK-HOME/conf目录下没有放置hive-site.xml文件,元数据的状态就是in-memory
2、hive状态:如果我们在SPARK-HOME/conf目录下放置了,hive-site.xml文件,那么默认情况下,spark-sql的元数据的状态就是hive.
二、SparkSQL 中 RDD 、DataFrame 、DataSet 三者的区别与联系
1、RDD:
RDD前置知识:
优点:
编译时类型安全:编译时就能检查出类型错误
面向对象的编程风格:直接通过类名点的方式来操作数据
缺点:
序列化和反序列化的性能开销
无论是集群间的通信, 还是 IO 操作都需要对对象的结构和数据进行序列化和反序列化。
GC 的性能开销 ,频繁的创建和销毁对象, 势必会增加 GC
spark2.0中,引入SparkSession作为DataSet和DataFrame API的切入点
2、DataFrame :
DataFrame与RDD的主要区别在于,DataFrame引入了 schema 表结构元信息、 off-heap 堆外内存。
schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。Spark通过 schema 就能够读懂数据, 因此在通信和 IO 时就只需要序列化和反序列化数据, 而结构的部分就可以省略了。
off-heap 堆外内存,意味着 JVM堆以外的内存, 这些内存直接受操作系统管理(而不是 JVM)。Spark能够以二进制的形式序列化数据(不包括结构)到 off-heap 中, 当要操作数据时,就直接操作 off-heap 内存。由于 Spark 理解 schema,所以知道该如何操作。off-heap 就像地盘,schema 就像地图,Spark有地图又有自己地盘了,就可以自己说了算了,不再受 JVM的限制,也就不再收 GC 的困扰了。
缺点:DataFrame 不是类型安全的,API也不是面向对象风格的。
这里的类型安全是指:编译时检查类型是否合法,例如程序需要 new A()你传了一个 B类 过来。不会出现变量的类型错误。
3、DataSet:
DataSet结合了RDD和DataFrame的优点,即类型安全,又高效。
DataSet结合了 RDD和 DataFrame 的优点,并带来的一个新的概念 Encoder 编码器。当序列化数据时,Encoder产生字节码与 off-heap 进行交互,能够达到按需访问数据的效果,而不用反序列化整个对象。Spark还没有提供自定义 Encoder 的 API,但是未来会加入。
RDD 和 DataSet区别:
DataSet以 Catalyst 逻辑执行计划表示,并且数据以编码的二进制形式被存储,不需要反序列化就可以执行 sorting、shuffle 等操作。DataSet创立需要一个显式的 Encoder,把对象序列化为二进制,可以把对象的 scheme映射为 Spark SQL类型,然而 RDD 依赖于运行时反射机制。DataSet比 RDD 性能要好很多。
DataFrame 和 DataSet区别:
Dataset可以认为是 DataFrame 的一个特例,主要区别是 Dataset 每一个 record存储的是一个强类型值而不是一个 Row。因此具有如下三个特点:
⚫ DataSet可以在编译时检查类型
⚫ DataSet是面向对象的编程接口。
⚫ 后面版本 DataFrame 会继承 DataSet,DataFrame 是面向 Spark SQL的接口。
DataFrame 和 DataSet可以相互转化,df.as[ElementType]这样可以把 DataFrame 转化为DataSet,ds.toDF()这样可以把 DataSet 转化为 DataFrame
参考博客:DataSet https://www.cnblogs.com/frankdeng/p/9301760.html
参考博客:sparkSql https://www.cnblogs.com/frankdeng/p/9301743.html