sparksql 概述

sparksql 概述

<span>sparksql 概述</span>

 

什么是Spark SQL?

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

 

<span>sparksql 概述</span>

 

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

<span>sparksql 概述</span>

 

Spark SQL的特点

1)易整合

 

<span>sparksql 概述</span>

 

2)统一的数据访问方式

 

<span>sparksql 概述</span>

 

3)兼容Hive

 

<span>sparksql 概述</span>

 

4)标准的数据连接

 

<span>sparksql 概述</span><span>sparksql 概述</span>

 

什么是DataFrame?

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

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

 

<span>sparksql 概述</span>

 

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

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

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

 

<span>sparksql 概述</span>

 

比如下面一个例子:

 

<span>sparksql 概述</span>

 

 

<span>sparksql 概述</span>

 

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

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

<span>sparksql 概述</span>

 

什么是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对象和类对象之间的类比。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119647.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • java常用类之Calendar类[通俗易懂]

    java常用类之Calendar类[通俗易懂]java常用类之Calendar类Calendar类提供了获取或者设置各种日历的字段的方法。构造方法protectedCalendar():由于修饰符是prodected;所以无法直接创建该对象其他方法方法名说明staticCalendargetInstance()使用默认时区或区域获取日历voidset(intyear,intmonth,intdate,inthourofday,intminute,intsecond)设置日历的时分秒

    2022年9月15日
  • [261]Connection reset by peer的常见原因及解决办法[通俗易懂]

    [261]Connection reset by peer的常见原因及解决办法[通俗易懂]1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connectresetbypeer)。Socket默认连接60秒,60秒之内没有进行心跳交互,即读写数据,就会自动关闭连接。2,一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connectionreset)。简单的…

    2022年6月26日
  • Mysql 多表连接查询

    Mysql 多表连接查询本文部分内容转载至:Mysql多表查询详解,同时感谢原作者的整理与创作;

    2022年5月22日
  • ubuntu安装 gcc 5.4.0

    ubuntu安装 gcc 5.4.0ubuntu安装gcc5.4版本Ubuntu高版本如何安装低版本GCC更改默认版本

    2022年7月24日
  • 博客数据库被删,丢失部分数据!

    博客数据库被删,丢失部分数据!

    2021年8月11日
  • c语言oj得pe,ACM入门之OJ~

    c语言oj得pe,ACM入门之OJ~所谓OJ,顾名思义OnlineJudge,一个用户提交的程序在OnlineJudge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被OnlineJudge系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件。最后系统返回给用户一个状态:通过(Ac…

    2022年6月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号