sparksql 概述

什么是Spark SQL?

Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和DataSet,并且作为分布式SQL查询引擎的作用。

我们已经学习了Hive,它是将Hive SQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduc的程序的复杂性,由于MapReduce这种计算模型执行效率比较慢。所有Spark SQL的应运而生,它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快!

Spark SQL的特点

1)易整合

2)统一的数据访问方式

3)兼容Hive

4)标准的数据连接

什么是DataFrame?

与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema。

同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。从API易用性的角度上看,DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低。

上图直观地体现了DataFrame和RDD的区别。左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。

DataFrame是为数据提供了Schema的视图。可以把它当做数据库中的一张表来对待,DataFrame也是懒执行的。性能上比RDD要高,主要原因:

优化的执行计划:查询计划通过Spark catalyst optimiser(Spark的优化器)进行优化。

比如下面一个例子:

为了说明查询优化,我们来看上图展示的人口数据分析的示例。图中构造了两个DataFrame,将它们join之后又做了一次filter操作。如果原封不动地执行这个执行计划,最终的执行效率是不高的。因为join是一个代价较大的操作,也可能会产生一个较大的数据集。如果我们能将filter下推到 join下方,先对DataFrame进行过滤,再join过滤后的较小的结果集,便可以有效缩短执行时间。而Spark SQL的查询优化器正是这样做的。

简而言之,逻辑查询计划优化就是一个利用基于关系代数的等价变换,将高成本的操作替换为低成本操作的过程。

什么是DataSet?

1)是Dataframe API的一个扩展,是Spark最新的数据抽象。

2)用户友好的API风格,既具有类型安全检查也具有Dataframe的查询优化特性。

3)Dataset支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提高了效率。

4)样例类被用来在Dataset中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称。

5)Dataframe是Dataset的特列,DataFrame=Dataset[Row] ,所以可以通过as方法将Dataframe转换为Dataset。Row是一个类型,跟Car、Person这些的类型一样,所有的表结构信息我都用Row来表示。

6)DataSet是强类型的。比如可以有Dataset[Car],Dataset[Person]

7)DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错,而DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。就跟JSON对象和类对象之间的类比。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SparkSQL内核解析-执行全过程概述

    用来表示一行数据的类,根据下标来访问和操作元素,其中每一列都是Catalyst内部定义的数据类型;物理算子树产生和转换的RDD类型为RDD[InternalRo...

    王知无-import_bigdata
  • SparkSQL入门_1

    概述 DataFrame SQL query ReadWrite Example 概述 先说说准备工作吧。 目前使用的是伪分布式模式,hadoop,spar...

    用户1147754
  • Spark on Hive & Hive on Spark,傻傻分不清楚

    Spark通过Spark-SQL使用hive 语句,操作hive,底层运行的还是 spark rdd。

    王知无-import_bigdata
  • Spark之【SparkSQL编程】系列(No4)——《IDEA创建SparkSQL程序》

    在之前的博客SparkSQL系列中,已经大致为大家介绍了DataFrame,DataSet的概念以及它们之间与RDD之间的互转的操作描述。本篇博...

    大数据梦想家
  • 秋名山老司机从上车到翻车的悲痛经历,带你深刻了解什么是Spark on Hive!

    本篇博客,博主为大家分享的内容是如何实现Spark on Hive,即让Hive只作为存储角色,Spark负责sql解析优化,执行…话不多说,直...

    大数据梦想家
  • SparkSQL快速入门系列(6)

    上一篇《SparkCore快速入门系列(5)》,下面给大家更新一篇SparkSQL入门级的讲解。

    刘浩的BigDataPath
  • Hive迁移Saprk SQL的坑和改进办法

    Qcon 全球软件开发者大会2016北京站 演讲主题:Spark在360的大规模实践与经验分享 李远策 360-Spark集群概况 ? 360-Spark集...

    Albert陈凯
  • 构建技术中台——基于SQL的批流一体化ETL

    本文介绍了 SparkSQL 和 Flink 对于批流支持的特性以及批流一体化支持框架的难点。在介绍批流一体化实现的同时,重点分析了基于普元 SparkSQL-...

    yuanyi928
  • 简单回答:SparkSQL数据抽象和SparkSQL底层执行过程

    就易用性而言,对比传统的MapReduce API,Spark的RDD API有了数量级的飞跃并不为过。然而,对于没有MapReduce和函数式编程经验的新手来...

    大数据真好玩

扫码关注云+社区

领取腾讯云代金券