02-spark sql
1、概念
Spark SQL是一个用来处理结构化数据的Spark组件。
优点:
①SparkSQL是一个SQL解析引擎,将SQL解析成特殊的RDD(DataFrame),然后在Spark集群中运行
②SparkSQL是用来处理结构化数据的(先将非结构化的数据转换成结构化数据)
③SparkSQL支持两种编程API 1.SQL方式 2.DataFrame的方式(DSL)
④SparkSQL兼容hive(元数据库、SQL语法、UDF、序列化、反序列化机制) //UDF很重要,自定义函数
⑤支持多种输入输出(mysql,json,csv,parquet等)
2、DataFrame、Dataset、RDD
①共同点:
1、RDD、DataFrame、Dataset全都是spark平台下的分布式弹性数据集,都是spark的数据集合抽象。
2、三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action时,三者才会开始遍历运算
val rdd=spark.sparkContext.parallelize(Seq(("a", 1), ("b", 1), ("a", 1)))
rdd.map{line=>
println("运行")
line._1
} //不会运行
3、三者都有partition的概念、都有filter、map等常用算子
var predata=data.repartition(24).mapPartitions(func) //有分区概念,说明是分布式
②区别:
RDD:
1、RDD不支持sparksql操作
2、会频繁的创建销毁对象,会增加GC开销 //比如map操作,对每行进行遍历,每行都会创建line等对象,然后销毁
注:我们可以利用mapPartitions方法来重载RDD单个分片内的数据创建方式,用复用可变对象的方式来减小对象分配和GC的开销。
注:我们写的sql、算子里面其实Spark SQL在框架内部已经在各种可能的情况下尽量重用了对象
3、无论是集群间的通信,还是IO操作都需要对对象的结构和数据进行序列化和反序列化,RDD由于带上了元数据,所以序列化、反序列化的开销比较大
注:由于DataFrame每行的数据类型相同,所以序列化不需要带上元数据
4、由于它基本和hadoop一样万能的,对于行数据没有特定的数据结构,因此没有针对特殊场景的优化,只能在执行的逻辑上进行优化
总结:GC、序列化开销大,不能针对性优化
DataFrame:
1、结构化数据处理非常方便,支持多种输入输出(mysql,json,csv,parquet等)
2、DataFrame引入了schema和off-heap(数据存储使用堆外内存,增加元数据)
schema : RDD每一行的数据, 结构都是一样的. 这个结构就存储在schema中,并且Spark对schema进行了保存. Spark通过schame就能够读懂数据,
因此在通信和IO时就只需要序列化和反序列化数据, 而结构的部分就可以省略了.
off-heap : 意味着JVM堆外内存, 这些内存直接受操作系统管理(而不是JVM)。Spark能够以二进制的形式序列化数据(不包括结构)到off-heap中,
当要操作数据时(比如shuffle), 就直接操作off-heap内存. 由于Spark理解schema, 所以知道该如何操作,也同样减少了GC,提升了运行速度
注:比如说shuffle,每个分区的类型都一样,就不用每个分区都序列化schema了,去读一下原来Spark保存的schema就行
数据存储在堆外内存,也就直接从堆外去取就行,也同样较少了GC,提升了运行速度
注:schema包含了 表头(表的描述信息),描述了有多少列,每一列数叫什么名字、什么类型、能不能为空
注:DataFrame = RDD+Schema。类似于传统数据库中的二维表格。
3、RDD执行作业只能在调度阶段进行简单通用的优化,而DataFrame带有数据集内部的结构,可以根据这些信息进行针对性的优化,最终实现优化运行效率
4、hive兼容,支持hql、udf(自定义函数)等 //udf自定义函数很重要,hive中的函数、都支持!!!
缺点:
1.编译时不能类型转化安全检查,运行时才能确定是否有问题
2.对于对象支持不友好,rdd内部数据直接以java对象存储,dataframe内存存储的是row对象而不能是自定义对象
注:dataframe里面都是一个个的Row对象,即便存入的是样例类,也是Row,其实可以将Row理解为Object,虽然也能很好的拿出每一列数据
总结:GC、序列化开销小,堆外保存(序列化文件),能针对性优化,支持SQL,支持多种数据来源与保存,只是不能自定义对象
Dataset:
1.和RDD一样,只不过支持自定义对象存储
2.类型转化安全,代码友好
注:在进行toDF、toDS操作都需要这个包进行支持:import x.implicits._ //这里的x是SparkSession的变量名
注:dataframe每行的类型为Row(object),Dataset可以为Person、Animal等自定义类,但都是一张表,类似于数据库中的表一样!
注:所以说DF是弱类型,DS是强类型
val col1=line.getAs[String]("col1") //因为是弱类型,所以根据列名获取某一列的值
val col1=line.col1 //强类型,直接点就行了
③转化
rdd、toDF、toDS
val rdd1=testDF.rdd
特例:
val ds1 = df.as[Person]
④常用方法:
df.show()
df.printSchema() //打印底层的物理执行计划
df.explain() //收集计算结果到dirver端
df.collect() //收集结果到driver端
3、Parquet
Parquet是列式存储格式的一种文件类型,列式存储有以下的核心优势:
a)可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。
b)压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如RunLength Encoding和Delta Encoding)进一步节约存储空间。
c)只读取需要的列,支持向量运算,能够获取更好的扫描性能。
注:Parquet是spark其推荐的数据存储格式(默认存储为parquet)。
注:parquet本质是对shuffle数据进行了压缩,减少了网络开销,提高了shuffle速度。其他的压缩还有orc等
4、自定义函数
spark sql、hive都是这三种:
UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等(一进一出)
UDAF(User- Defined Aggregation Funcation),用户自定义聚合函数,类似在group by之后使用的sum,avg等(多进一出)
UDTF(User-Defined Table-Generating Functions),用户自定义生成函数,有点像stream里面的flatMap(多进多出)
5、Join优化
①小表 join 大表
join操作尽量以大表为基表,join默认右边为基表,左连接,左表为基表,右连接,右表为基表。
②Broadcast Join
维度表:一般指固定的、变动较少的表,例如联系人、物品种类等,一般数据有限。
事实表:一般记录流水,比如销售清单等,通常随着时间的增长不断膨胀。
eg:因为Join操作是对两个表中key值相同的记录进行连接,在SparkSQL中,对两个表做Join最直接的方式是先根据key
分区,再在每个分区中把key值相同的记录拿出来做连接操作。但这样就不可避免地涉及到shuffle,而shuffle在
Spark中是比较耗时的操作,我们应该尽可能的设计Spark应用使其避免大量的shuffle。
为了避免shuffle,我们可以将大小有限的维度表的全部数据分发到每个节点
上,供事实表使用。executor存储维度表的全部数据,一定程度上牺牲了空间,换取shuffle操作大量的耗时,这在
SparkSQL中称作Broadcast Join
Broadcast Join的条件:
1. 被广播的表需要小于spark.sql.autoBroadcastJoinThreshold所配置的值,默认是10M
2. 基表不能被广播,比如left outer join时,只能广播右表
③Shuffle Hash Join
当一侧的表比较小时,我们选择将其广播出去以避免shuffle,提高性能。但因为被广播的表首先被collect到driver
段,然后被冗余分发到每个executor上,所以当表比较大时,采用broadcast join会对driver端和executor端造成
较大的压力。
Shuffle Hash Join分为两步:
1. 对两张表分别按照join keys进行重分区,即shuffle,目的是为了让有相同join keys值的记录分到对应的分区中
2. 对对应分区中的数据进行join,此处先将小表分区构造为一张hash表,然后根据大表分区中记录的join keys值拿出来进行匹配
④Sort Merge Join
比Shuffle Hash Join多了一层排序,每个分区进行排序,当join时候,但能过滤掉很多数据
02-spark sql的更多相关文章
- Spark SQL概念学习系列之Spark SQL概述
很多人一个误区,Spark SQL重点不是在SQL啊,而是在结构化数据处理! Spark SQL结构化数据处理 概要: 01 Spark SQL概述 02 Spark SQL基本原理 03 Spark ...
- Spark SQL 初步
已经Spark Submit 2013哪里有介绍Spark SQL.就在很多人都介绍Catalyst查询优化框架.经过一年的发展后,.今年Spark Submit 2014在.Databricks放弃 ...
- Spark SQL数据加载和保存实战
一:前置知识详解: Spark SQL重要是操作DataFrame,DataFrame本身提供了save和load的操作, Load:可以创建DataFrame, Save:把DataFrame中的数 ...
- spark SQL学习(案例-统计每日uv)
需求:统计每日uv package wujiadong_sparkSQL import org.apache.spark.sql.{Row, SQLContext} import org.apache ...
- spark SQL学习(spark连接 mysql)
spark连接mysql(打jar包方式) package wujiadong_sparkSQL import java.util.Properties import org.apache.spark ...
- spark SQL学习(数据源之json)
准备工作 数据文件students.json {"id":1, "name":"leo", "age":18} {&qu ...
- spark SQL学习(数据源之parquet)
Parquet是面向分析型业务得列式存储格式 编程方式加载数据 代码示例 package wujiadong_sparkSQL import org.apache.spark.sql.SQLConte ...
- spark SQL学习(load和save操作)
load操作:主要用于加载数据,创建出DataFrame save操作:主要用于将DataFrame中的数据保存到文件中 代码示例(默认为parquet数据源类型) package wujiadong ...
- Spark SQL数据载入和保存实战
一:前置知识具体解释: Spark SQL重要是操作DataFrame,DataFrame本身提供了save和load的操作. Load:能够创建DataFrame. Save:把DataFrame中 ...
- 「Spark」Spark SQL Thrift Server运行方式
Spark SQL可以使用JDBC/ODBC或命令行接口充当分布式查询引擎.这种模式,用户或者应用程序可以直接与Spark SQL交互,以运行SQL查询,无需编写任何代码. Spark SQL提供两种 ...
随机推荐
- express 与 koa 区别
express 与 koa 区别 区别项 express koa 中间件模型 Compress 模型 洋葱圈模型 对象个数 只有2个对象:Request 和 Response 有3个对象:Reques ...
- http 2.0 新特性
http 2.0 新特性: 二进制分帧 首部压缩 流量控制 多路复用 请求优先级 服务器推送 出处:https://juejin.im/post/5a4dfb2ef265da43305ee2d0
- kibana 启动 关闭 和进程查找
启动kibana : nohup ./kibana & 查看启动日志 : tail -f nohup kibana 使用 ps -ef|grep kibana 是查不到进程的,主要原因大概 ...
- 代码问题: 【ADNet】
[ADNet]: Yoo S, Yun K, Choi J Y. Action-Decision Networks for Visual Tracking with Deep Reinforcemen ...
- Elasticsearch集成HanLP分词器
1.通过git下载分词器代码. 连接如下:https://gitee.com/hualongdata/hanlp-ext hanlp官网如下:http://hanlp.linrunsoft.com/ ...
- 手动增加pe节并修改oep
一直想学学怎么动动pe文件,学习了几篇文章尤其是寒晨的文章后,自己动手也尝试了一下加节和修改oep,写出来供和我一样菜的一起进步. 一. 增加pe节需要的操作 1. 确定内存中的节的 ...
- windows10中git-bash闪退的解决办法
windows10中git-bash闪退的解决办法 出现错误详情 Windows10 64位专业版安装git .18之后出现 Git闪退,报错信息:bash: /dev/null: No such d ...
- PHP 解压 ZIP 文件到指定文件夹
本类实现参考 php manual 评论 [php] view plain copy /** * function: 解压zip 格式的文件 * author:friker * date:2015-1 ...
- backgroud 应用减小资源大小和请求数
一,一个典型的应用,利用小图的自动延伸,实现整个网页背景图,充分节约资源宽带.如:汽车之家的404页背景图就是这样 <div style="height: 3000px; backgr ...
- vue中mounted中无法获取到dom元素
一.解决方案: 加上异步setTimeout,延迟获取dom的代码的执行 mounted() { // debugger this.$nextTick(()=> { setTimeout(()= ...