Spark SQL 介绍

文章目录

  • Spark SQL
    • 1、Hive on SparkSQL
    • 2、SparkSQL 优点
    • 3、SparkSQL 特点
      • 1) 容易整合
      • 2) 统一的数据访问
      • 3) 兼容 Hive
      • 4) 标准的数据连接
    • 4、DataFrame 是什么
    • 5、DataSet 是什么

Spark SQL

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

1、Hive on 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 Colummnar Storage)、Hive 兼容性等,重新开发了SparkSQL代码,由于摆脱了对Hive的依赖性,SparkSQL 无论在数据兼容,性能优化,组件扩展方面都得到了极大的方便。

  • 数据兼容方面:SparkSQL 不但兼容 Hive,还可以从RDD,parquet 文件,JSON 文件中怕哪个获取数据,未来版本甚至支持获取RDBMS 数据 、以及cassandra 等 NoSQL 数据。

  • 性能优化方面:除了采取In-Menory Columnar Storage,byte-code generation 等优化技术外,将会引进Cost Model 对查询进行动态评估,获取最佳物理计划等等。

  • 组件扩展方面:无论是SQL的语法解析器,分析器还是优化器都可以重新定义,进行扩展。

2、SparkSQL 优点

SparkSQL 作为Spark生态圈的一员继续发展,而不再受限于Hive,只是兼容Hive,而Hive on Spark 是一个Hive 的发展计划,该计划将Spark 作为 Hive 的底层引擎之一,也就是说,Hive将不再受限于一个引擎,可以采用Map-Reduce,Tez,Spark 等引擎。
对于开发人员来讲,SparkSQL 可以简化 RDD 的开发,提高开发效率,且执行效率非常快,所以实际工作中,基本上采用的就是SparkSQL,Spark SQL 为了简化RDD的开发,提高开发效率,提供了2个编程抽象,类似SparkCore中的RDD。
DataFrame 和 DataSet

3、SparkSQL 特点

1) 容易整合

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

2) 统一的数据访问

使用相同的方式连接不同的数据源。比如:MYSQL啊,Hbase,Hive之类的。

3) 兼容 Hive

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

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 要更加友好,门槛更低。
Spark SQL 介绍_第1张图片
上面这张图直观地体现了 DataFrame 和 RDD的区别。
左侧的 RDD[Person] 虽然以 Person 为参数类型,但 Spark 框架本身不了解 Person 类的内部结构。而右侧的DataFrame 却提供了详细的结构信息,使得 Spark SQL 可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。
DataFrame 是为数据提供了Schema(元数据)的视图。可以把它当做数据库中的一张表来对待,DataFrame 也是懒执行的,但性能上比RDD 要高,主要原因:优化的执行计划,即查询计划通过 Spark catalyst optimiser 进行优化。

5、DataSet 是什么

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

  • 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,spark,sql,数据库)