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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Windows 7系统安装MySQL5.5.21图解

    Windows 7系统安装MySQL5.5.21图解

    2021年11月16日
  • 申请软件著作权步骤_著作权包括哪些

    申请软件著作权步骤_著作权包括哪些今年八月底版权中心系统升级,新系统相对好用一些,至少不用再拿IE访问了,但是多了一项实名认证。下面介绍新系统的操作流程。目录注册、登录和实名认证注册登录实名认证软件登记申请申请表填写鉴别材料身份证明文件权利归属证明文件其他材料提交材料变更登记注册、登录和实名认证首先访问版权中心系统:https://register.ccopyright.com.cn/login.html,如果老系统有账号直接登录即可,没有的话需要注册。注册点击注册按钮进入注册。根据实际情况选择个人或单位,每个个人或单位只能在

  • 小程序父组件向子组件传值

    小程序父组件向子组件传值子组件:tabs1父组件:demo04先将子组件和父组件直接产生特定的联系,需要在demo04.json里面以键值对的方式添加。添加完毕后在父组件中就可以使用标签,就可以渲染出子组件内容。因为tabs1多次复用,所以数据不能在tabs1.js中写死。一般都是由父组件中data数据传到子组件。1.先在父组件data中添加list数据,data:{list:[{id:“2”,nam…

  • python deepcopy函数_Python deepcopy

    python deepcopy函数_Python deepcopy我想为给定的SQLAlchemy映射类重写__deepcopy__,以便它忽略任何SQLA属性,但深入复制其他所有类的类.我并不是特别熟悉覆盖任何Python的内置对象,但我对我想要的东西有所了解.让我们创建一个使用SQLA映射的非常简单的类User.classUser(object):def__init__(self,user_id=None,name=None):self.user_i…

  • 微信小程序不在以下 request 合法域名列表中「建议收藏」

    微信小程序不在以下 request 合法域名列表中「建议收藏」首先检查开发工具 设置 详情===》本地设置;取消以下勾选框查看异常问题;不在以下 request 合法域名列表中,请参考文查看是否配置域名信息,如果没有配置则去小程序后台设置即可多个已 “;” 分割即可。配置完毕后,在开发者工具刷新查看,然后 记得 【重启开发者工具】就解决啦~…

  • img 转化成iso镜像的办法「建议收藏」

    img 转化成iso镜像的办法「建议收藏」最近在使用KVM启用虚拟机,然后将里面的环境和配置配置成我们公司需要的环境,再打包成iso镜像,之后再次生成新的虚拟机。但是KVM启动出的镜像生成的是img镜像,需要将img镜像转换成iso镜像

发表回复

您的电子邮箱地址不会被公开。

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